标签归档:面试

PHP面试常用算法

  一、冒泡排序

  基本思想:

    对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样比较小(大)的数值就将逐渐从后面向前面移动。

  //冒泡排序

 
 1 php
 2 
 3     function mysort($arr)
 4     {
 5         for($i = 0; $i < count($arr); $i++)
 6         {
 7             $isSort = false;
 8             for ($j=0; $j< count($arr) - $i - 1; $j++) 
 9             {
10                 if($arr[$j] < $arr[$j+1])
11                 {
12                     $isSort = true;
13                     $temp = $arr[$j];
14                     $arr[$j] = $arr[$j+1];
15                     $arr[$j+1] = $temp ;
16                 }
17             }
18             if($isSort)
19             {
20                 break;
21             }
22         }
23         return $arr;
24     }
25 
26     $arr = array(3,1,2);
27     var_dump(mysort($arr));
28 ?>

View Code

   二、快速排序

  基本思想:

    在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致。

  //快速排序

 
 1 php
 2     //快速排序
 3         function quick_sort($arr) 
 4         {
 5             //先判断是否需要继续进行
 6             $length = count($arr);
 7             if($length <= 1) 
 8             {
 9                 return $arr;
10             }
11         
12             $base_num = $arr[0];//选择一个标尺  选择第一个元素
13 
14             //初始化两个数组
15             $left_array = array();//小于标尺的
16             $right_array = array();//大于标尺的
17             for($i=1; $i<$length; $i++) 
18             {            //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
19                 if($base_num > $arr[$i]) 
20                 {
21                     //放入左边数组
22                     $left_array[] = $arr[$i];
23                 } 
24                 else 
25                 {
26                     //放入右边
27                     $right_array[] = $arr[$i];
28                 }
29             }
30             //再分别对 左边 和 右边的数组进行相同的排序处理方式
31             //递归调用这个函数,并记录结果
32             $left_array = quick_sort($left_array);
33             $right_array = quick_sort($right_array);
34             //合并左边 标尺 右边
35             return array_merge($left_array, array($base_num), $right_array);
36         }
37 
38         $arr = array(3,1,2);
39         var_dump(quick_sort($arr));
40 
41 ?>

View Code

  

  三、二分查找

  基本思想:

    假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)

  //二分查找

 1 php
 2     //二分查找
 3     function bin_search($arr,$low,$high,$k)
 4     {
 5         if($low <= $high)
 6         {
 7             $mid = intval(($low + $high)/2);
 8             if($arr[$mid] == $k)
 9             {
10                 return $mid;
11             }
12             else if($k < $arr[$mid])
13             {
14                 return bin_search($arr,$low,$mid-1,$k);
15             }
16             else
17             {
18                 return bin_search($arr,$mid+1,$high,$k);
19             }
20         }
21         return -1;
22     }
23 
24     $arr = array(1,2,3,4,5,6,7,8,9,10);
25 
26     print(bin_search($arr,0,9,3));
27 ?>

View Code

 

  四、顺序查找

  基本思想:

    从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。

    //顺序查找 

复制代码
 1 php
 2     //顺序查找
 3     function seq_search($arr,$n,$k)
 4     {
 5         $array[$n] = $k;
 6         for($i = 0;$i < $n; $i++)
 7         {
 8             if($arr[$i] == $k)
 9             {
10                 break;
11             }
12         }
13 
14         if($i < $n)
15         {
16             return $i;
17         }
18         else
19         {
20             return -1;
21         }
22     }
23 ?>

View Code

  

  五、写一个函数,能够遍历一个文件下的所有文件和子文件夹

 
 1 php    
 2     function my_scandir($dir)
 3     {
 4         $files = array();
 5         if($handle = opendir($dir))
 6         {
 7             while (($file = readdir($handle))!== false) 
 8             {
 9                 if($file != '..' && $file != '.')
10                 {
11                     if(is_dir($dir."/".$file))
12                     {
13                         $files[$file]=my_scandir($dir."/".$file);
14                     }
15                     else
16                     {
17                         $files[] = $file;
18                     }
19                 }
20             }
21 
22             closedir($handle);
23             return $files;
24         }
25     }
26 
27     var_dump(my_scandir('../'));
28 ?>

View Code

    六、写一个函数,尽可能高效的从一个标准url中取出文件的扩展名

 
 1 php
 2     function getExt($url)
 3     {
 4         $arr = parse_url($url);//parse_url解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分
 5         //'scheme' => string 'http' (length=4)
 6         //'host' => string 'www.sina.com.cn' (length=15)
 7         //'path' => string '/abc/de/fg.php' (length=14)
 8         //'query' => string 'id=1' (length=4)
 9         $file = basename($arr['path']);// basename函数返回路径中的文件名部分
10         $ext = explode('.', $file);
11         return $ext[count($ext)-1];
12     }
13 
14     print(getExt('http://www.sina.com.cn/abc/de/fg.html.php?id=1'));
15 
16 ?>

View Code

  七、实现中文字符串截取无乱码的方法

    可使用mb_substr,但是需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

Java中字符串内存位置浅析

前言

之前写过一篇关于JVM内存区域划分的文章,但是昨天接到蚂蚁金服的面试,问到JVM相关的内容,解释一下JVM的内存区域划分,这部分答得还不错,但是后来又问了Java里面String存放的位置,之前只记得String是一个不变的量,应该是要存放在常量池里面的,但是后来问到new一个String出来应该是放到哪里的,这个应该是放到堆里面的,后来又问到String的引用是放在什么地方的,当时傻逼的说也是放在堆里面的,现在总结一下:基本类型的变量数据和对象的引用都是放在栈里面的,对象本身放在堆里面,显式的String常量放在常量池,String对象放在堆中。

常量池的说明

常量池之前是放在方法区里面的,也就是在永久代里面的,从JDK7开始移到了堆里面。这一改变我们可以从Oraclerelease version的notes里的** Important RFEs Addressed in JDK 7 **看到。

Area: HotSpot
Synopsis: In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences.
RFE: 6962931

String内存位置说明

  1. 显式的String常量

    String a = "holten";
    String b = "holten";
  • 第一句代码执行后就在常量池中创建了一个值为holten的String对象;
  • 第二句执行时,因为常量池中存在holten所以就不再创建新的String对象了。
  • 此时该字符串的引用在虚拟机栈里面。
  1. String对象

    String a = new String("holtenObj");
    String b = new String("holtenObj");
  • Class被加载时就在常量池中创建了一个值为holtenObj的String对象,第一句执行时会在堆里创建new String(“holtenObj”)对象;
  • 第二句执行时,因为常量池中存在holtenObj所以就不再创建新的String对象了,直接在堆里创建new String(“holtenObj”)对象。

验证一下

/** * Created by holten.gao on 2016/8/16. */
public class Main {
    publicstaticvoidmain(String[] args){
        String str1 = "高小天";
        String str2 = "高小天";
        System.out.println(str1==str2);//true
        
        String str3 = new String("高大天");
        String str4 = new String("高大天");
        System.out.println(str3==str4);//false
    }
}

返回结果:

true
false

Android Service生命周期及用法!

Service概念及用途:

Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那
我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我
们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以
用Service在后台定时更新,而不用每打开应用的时候在去获取。

Service生命周期
:

Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,具体的可以看下面的实例。

Service与Activity通信:
Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)这一节我不作过多描述,当我们想获取启动的Service实例时,我们可以用到bindService和onBindService方法,它们分别执行了Service中IBinder()和onUnbind()方法。

 

为了让大家 更容易理解,我写了一个简单的Demo,大家可以模仿着我,一步一步的来。

 

第一步:新建一个Android工程,我这里命名为ServiceDemo.

第二步:修改main.xml代码,我这里增加了四个按钮,代码如下:

 

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
  3.     android:orientation=“vertical”
  4.     android:layout_width=“fill_parent”
  5.     android:layout_height=“fill_parent”
  6.     >
  7.     <TextView
  8.         android:id=“@+id/text”
  9.         android:layout_width=“fill_parent”
  10.         android:layout_height=“wrap_content”
  11.         android:text=“@string/hello”
  12.         />
  13.     <Button
  14.         android:id=“@+id/startservice”
  15.         android:layout_width=“fill_parent”
  16.         android:layout_height=“wrap_content”
  17.         android:text=“startService”
  18.     />
  19.     <Button
  20.         android:id=“@+id/stopservice”
  21.         android:layout_width=“fill_parent”
  22.         android:layout_height=“wrap_content”
  23.         android:text=“stopService”
  24.     />
  25.     <Button
  26.         android:id=“@+id/bindservice”
  27.         android:layout_width=“fill_parent”
  28.         android:layout_height=“wrap_content”
  29.         android:text=“bindService”
  30.     />
  31.     <Button
  32.         android:id=“@+id/unbindservice”
  33.         android:layout_width=“fill_parent”
  34.         android:layout_height=“wrap_content”
  35.         android:text=“unbindService”
  36.     />
  37. </LinearLayout>

第三步:新建一个Service,命名为MyService.java代码如下:

 

  1. package com.tutor.servicedemo;
  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.os.Binder;
  5. import android.os.IBinder;
  6. import android.text.format.Time;
  7. import android.util.Log;
  8. public class MyService extends Service {
  9.     //定义个一个Tag标签
  10.     private static final String TAG = “MyService”;
  11.     //这里定义吧一个Binder类,用在onBind()有方法里,这样Activity那边可以获取到
  12.     private MyBinder mBinder = new MyBinder();
  13.     @Override
  14.     public IBinder onBind(Intent intent) {
  15.         Log.e(TAG, “start IBinder~~~”);
  16.         return mBinder;
  17.     }
  18.     @Override
  19.     public void onCreate() {
  20.         Log.e(TAG, “start onCreate~~~”);
  21.         super.onCreate();
  22.     }
  23.     @Override
  24.     public void onStart(Intent intent, int startId) {
  25.         Log.e(TAG, “start onStart~~~”);
  26.         super.onStart(intent, startId);
  27.     }
  28.     @Override
  29.     public void onDestroy() {
  30.         Log.e(TAG, “start onDestroy~~~”);
  31.         super.onDestroy();
  32.     }
  33.     @Override
  34.     public boolean onUnbind(Intent intent) {
  35.         Log.e(TAG, “start onUnbind~~~”);
  36.         return super.onUnbind(intent);
  37.     }
  38.     //这里我写了一个获取当前时间的函数,不过没有格式化就先这么着吧
  39.     public String getSystemTime(){
  40.         Time t = new Time();
  41.         t.setToNow();
  42.         return t.toString();
  43.     }
  44.     public class MyBinder extends Binder{
  45.         MyService getService()
  46.         {
  47.             return MyService.this;
  48.         }
  49.     }
  50. }

第四步:修改ServiceDemo.java,代码如下:

 

  1. package com.tutor.servicedemo;
  2. import android.app.Activity;
  3. import android.content.ComponentName;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.ServiceConnection;
  7. import android.os.Bundle;
  8. import android.os.IBinder;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.widget.Button;
  12. import android.widget.TextView;
  13. public class ServiceDemo extends Activity implements OnClickListener{
  14.     private MyService  mMyService;
  15.     private TextView mTextView;
  16.     private Button startServiceButton;
  17.     private Button stopServiceButton;
  18.     private Button bindServiceButton;
  19.     private Button unbindServiceButton;
  20.     private Context mContext;
  21.     //这里需要用到ServiceConnection在Context.bindService和context.unBindService()里用到
  22.     private ServiceConnection mServiceConnection = new ServiceConnection() {
  23.         //当我bindService时,让TextView显示MyService里getSystemTime()方法的返回值 
  24.         public void onServiceConnected(ComponentName name, IBinder service) {
  25.             // TODO Auto-generated method stub
  26.             mMyService = ((MyService.MyBinder)service).getService();
  27.             mTextView.setText(“I am frome Service :” + mMyService.getSystemTime());
  28.         }
  29.         public void onServiceDisconnected(ComponentName name) {
  30.             // TODO Auto-generated method stub
  31.         }
  32.     };
  33.     public void onCreate(Bundle savedInstanceState) {
  34.         super.onCreate(savedInstanceState);
  35.         setContentView(R.layout.main);
  36.         setupViews();
  37.     }
  38.     public void setupViews(){
  39.         mContext = ServiceDemo.this;
  40.         mTextView = (TextView)findViewById(R.id.text);
  41.         startServiceButton = (Button)findViewById(R.id.startservice);
  42.         stopServiceButton = (Button)findViewById(R.id.stopservice);
  43.         bindServiceButton = (Button)findViewById(R.id.bindservice);
  44.         unbindServiceButton = (Button)findViewById(R.id.unbindservice);
  45.         startServiceButton.setOnClickListener(this);
  46.         stopServiceButton.setOnClickListener(this);
  47.         bindServiceButton.setOnClickListener(this);
  48.         unbindServiceButton.setOnClickListener(this);
  49.     }
  50.     public void onClick(View v) {
  51.         // TODO Auto-generated method stub
  52.         if(v == startServiceButton){
  53.             Intent i  = new Intent();
  54.             i.setClass(ServiceDemo.this, MyService.class);
  55.             mContext.startService(i);
  56.         }else if(v == stopServiceButton){
  57.             Intent i  = new Intent();
  58.             i.setClass(ServiceDemo.this, MyService.class);
  59.             mContext.stopService(i);
  60.         }else if(v == bindServiceButton){
  61.             Intent i  = new Intent();
  62.             i.setClass(ServiceDemo.this, MyService.class);
  63.             mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);
  64.         }else{
  65.             mContext.unbindService(mServiceConnection);
  66.         }
  67.     }
  68. }

第五步:修改AndroidManifest.xml代码(将我们新建的MyService注册进去如下代码第14行:)

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <manifest xmlns:android=“http://schemas.android.com/apk/res/android”
  3.       package=“com.tutor.servicedemo”
  4.       android:versionCode=“1”
  5.       android:versionName=“1.0”>
  6.     <application android:icon=“@drawable/icon” android:label=“@string/app_name”>
  7.         <activity android:name=“.ServiceDemo”
  8.                   android:label=“@string/app_name”>
  9.             <intent-filter>
  10.                 <action android:name=“android.intent.action.MAIN” />
  11.                 <category android:name=“android.intent.category.LAUNCHER” />
  12.             </intent-filter>
  13.         </activity>
  14.         <service android:name=“.MyService” android:exported=“true”></service>
  15.     </application>
  16.     <uses-sdk android:minSdkVersion=“7” />
  17. </manifest>

 

第六步:执行上述工程,效果图如下:

点击startServie按钮时先后执行了Service中onCreate()->onStart()这两个方法,打开Logcat视窗效果如下图:

我们这时可以按HOME键进入Settings(设置)->Applications(应用)->Running Services(正在运行的服务)看一下我们新启动了一个服务,效果如下:

点击stopService按钮时,Service则执行了onDestroy()方法,效果图如下所示:

这时候我们再次点击startService按钮,然后点击bindService按钮(通常bindService都是bind已经启动的Service),我们看一下Service执行了IBinder()方法,以及TextView的值也有所变化了,如下两张图所示:

 

最后点击unbindService按钮,则Service执行了onUnbind()方法,如下图所示:

 

Android 面试题(答案最全)

  1. Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念?

    DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。

  2. sim卡的EF 文件有何作用?

    sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己的操作系统,EF就是作存储并和手机通讯用的

  3. 嵌入式操作系统内存管理有哪几种, 各有何特性?

    页式,段式,段页,用到了MMU,虚拟空间等技术

  4. 什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?

    嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、 军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。

  5. 一条最长的短信息约占多少byte?

    中文70(包括标点),英文160,160个字节。

  6. android中的动画有哪几类,它们的特点和区别是什么?

    两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

  7. handler机制的原理

    andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
    1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
    2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
    3) Message Queue(消息队列):用来存放线程放入的消息。
    4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

  8. 说说mvc模式的原理,它在android中的运用

android的官方建议应用程序的开发采用mvc模式。何谓mvc?
mvc是model,view,controller的缩写,mvc包含三个部分:
* 模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
* 视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构>中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
* 控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新>model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。

android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:

  • 视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定 可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通 信,幸运的是,android提供了它们之间非常方便的通信实现。
  • 控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
  • 模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。

9.Activity的生命周期

和其他手机 平台 的应用 程序 一样,Android的应用程序 的生命周期是被统一掌控 的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它,只能学习 并适应它。
简单地说一下为什么是这样:我们手机在运行 一个应用程序的时候,有可能打进来电话发进来短信 ,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能 ,另外系统也不允许你占用太多资源 ,至少要保证电话功能吧,所以资源不足的时候也就有可能被干掉。
言归正传,Activity的基本生命周期如下代码 所示:

public class MyActivity extends Activity {
  protected void onCreate(Bundle savedInstanceState);
  protected void onStart();
  protected void onResume();
  protected void onPause();
  protected void onStop();
  protected void onDestroy();
}

你自己写的Activity会按需要 重载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是
onCreate -> onStart -> onResume,
在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期。
但是有人问了,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity是全屏的,那么:onPause->onStop ,恢复的时候onStart->onResume ,如果打断 这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复 的时候onResume 。
详细介绍一下这几个方法中系统在做什么以及我们应该做什么:

onCreate: 在这里创建界面 ,做一些数据 的初始化工作
onStart: 到这一步变成用户可见不可交互 的
onResume: 变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个
Activity的最上面,运行完弹出栈,则回到上一个Activity)
onPause: 到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情
从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候
你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在
onResume里读出来,注意:这个方法里做的事情时间要短,因为下一
个activity不会等到这个方法完成才启动
onstop: 变得不可见 ,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里
把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛
异常的。

onPause,onstop, onDestroy,三种状态 下 activity都有可能被系统干掉
为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库 )。实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据 回滚,是吧?因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般都是采用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问题。

10.让Activity变成一个窗口:Activity属性设定

讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义 Activity的地方一句话:

android :theme=”@android:style/Theme.Dialog”
android:theme=”@android:style/Theme.Dialog”

这就使你的应用程序变成对话框的形式弹出来了,或者

android:theme=”@android:style/Theme.Translucent”
android:theme=”@android:style/Theme.Translucent”

就变成半透明的,[友情提示-.-]类似的这种activity的属性可以在android.R.styleable 类的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable上面说的是属性名称,具体有什么值是在android.R.style中 可以看到,比如这个”@android:style/Theme.Dialog” 就对应于android.R.style.Theme_Dialog ,(‘_’换成’.’ < –注意:这个是文章内容不是笑脸)就可以用在描述文件 中了,找找类定义和描述文件中的对应关系就都明白了。

11.你后台的Activity被系统回收怎么办?

onSaveInstanceState
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B. 这个时候A会执行

public void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  outState.putLong("id", 1234567890);
}

B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。

if(savedInstanceState != null){
  long id = savedInstanceState.getLong("id");
}

就像官方的Notepad教程 里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦, 没准你需要记住滚动条的位置…

12.调用与被调用:我们的通信使者Intent

要说Intent了,Intent就是这个这个意图 ,应用程序间Intent进行交流,打个电话啦,来个电话啦都会发Intent, 这个是Android架构的松耦合的精髓部分,大大提高了组件的复用性,比如你要在你的应用程序中点击按钮,给某人打电话,很简单啊,看下代码先:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
startActivity(intent);

扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。什么读联系人,发短信啊,邮件啊,统统只需要扔出intent就好了,这个部分设计 地确实很好啊。
那Intent通过什么来告诉系统需要谁来接受他呢?
通常使用Intent有两种方法,第一种是直接说明需要哪一个类来接收代码如下:

Intent intent = new Intent(this, MyActivity.class);
intent.getExtras().putString("id", "1");
tartActivity(intent);

第一种方式很明显,直接指定了MyActivity为接受者,并且传了一些数据给MyActivity,在MyActivity里可以用getIntent()来的到这个intent和数据。
第二种就需要先看一下AndroidMenifest中的intentfilter的配置了


< action android:name="android.intent.action.VIEW"/>
< action android:value="android.intent.action.EDIT"/>
< action android:value="android.intent.action.PICK"/>
< category android:name="android.intent.category.DEFAULT"/>
< data android:mimeType="vnd.android.cursor.dir/vnd.google.note"/>

这里面配置用到了action, data, category这些东西,那么聪明的你一定想到intent里也会有这些东西,然后一匹配不就找到接收者了吗?
action其实就是一个意图的字符串名称。
上面这段intent-filter的配置文件说明了这个Activity可以接受不同的Action,当然相应的程序逻辑也不一样咯,提一下那个 mimeType,他是在ContentProvider里定义的,你要是自己实现一个ContentProvider就知道了,必须指定 mimeType才能让数据被别人使用。
不知道原理说明白没,总结一句,就是你调用别的界面不是直接new那个界面,而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊,而且符合了生命周期被系统管理的原则。
想知道category都有啥,Android为你预先定制好的action都有啥等等,请亲自访问官方链接Intent
ps:想知道怎么调用系统应用程序的同学,可以仔细看一下你的logcat,每次运行一个程序的时候是不是有一些信息比如:

Starting activity: Intent { action=android.intent.action.MAINcategories={android.intent.category.LAUNCHER} flags=x10200000comp={com.android.camera/com.android.camera.GalleryPicker} }

再对照一下Intent的一些set方法,就知道怎么调用咯,希望你喜欢:)

13.如何退出Activity?如何安全退出已调用多个Activity的Application?

对于单一Activity的应用来说,退出很简单,直接finish()即可。
当然,也可以用killProcess()和System.exit()这样的方法。

但是,对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个Activity而已。
当然,网上也有人说可以。
就好像有人问,在应用里如何捕获Home键,有人就会说用keyCode比较KEYCODE_HOME即可,而事实上如果不修改framework,根本不可能做到这一点一样。
所以,最好还是自己亲自试一下。

那么,有没有办法直接退出整个应用呢?
在2.1之前,可以使用ActivityManager的restartPackage方法。
它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑。

可是,在2.2,这个方法失效了。
在2.2添加了一个新的方法,killBackgroundProcesses(),需要权限 android.permission.KILL_BACKGROUND_PROCESSES。
可惜的是,它和2.2的restartPackage一样,根本起不到应有的效果。

另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。
它需要权限android.permission.FORCE_STOP_PACKAGES。
并且需要添加android:sharedUserId=”android.uid.system”属性
同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。
因为需要在Android.mk中添加LOCAL_CERTIFICATE := platform。
而Android.mk是用于在Android源码下编译程序用的。

从以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。

现提供几个方法,供参考:

1、抛异常强制退出:
该方法通过抛异常,使程序Force Close。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

2、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

4、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。
但是这样做同样不完美。
你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。
但至少,我们的目的达到了,而且没有影响用户使用。

为了编程方便,最好定义一个Activity基类,处理这些共通问题。
摘自:http://blog.csdn.net/debug2/archive/2011/02/18/6193644.aspx

14.请介绍下Android中常用的五种布局。

  1. LinearLayout – 线性布局。
    orientation – 容器内元素的排列方式。vertical: 子元素们垂直排列;horizontal: 子元素们水平排列
    gravity – 内容的排列形式。
    常用的有 top, bottom, left, right, center 等
  2. AbsoluteLayout – 绝对布局。
    layout_x – x 坐标。以左上角为顶点
    layout_y – y 坐标。以左上角为顶点
  3. TableLayout – 表格式布局
    表格布局主要以行列的形式来管理子控件,其中每一行即一个TableRow对象,每个TableRow对象可以添加子控件,并且每加入一个空间即相当于添加了一列
  4. RelativeLayout – 相对布局。
    layout_centerInParent – 将当前元素放置到其容器内的水平方向和垂直方向的中央位置(类似的属性有 :layout_centerHorizontal, layout_alignParentLeft 等)
    layout_marginLeft – 设置当前元素相对于其容器的左侧边缘的距离
    layout_below – 放置当前元素到指定的元素的下面
    layout_alignRight – 当前元素与指定的元素右对齐
  5. FrameLayout – 层叠布局。以左上角为起点,将 FrameLayout 内的元素一层覆盖一层地显示,在帧布局中,先添加的图片会被后添加的图片覆盖。
    摘自:http://javalover00000.javaeye.com/blog/851266

15.请介绍下Android的数据存储方式。

Android提供了5种方式存储数据:
* 使用SharedPreferences存储数据;
* 文件存储数据;
* SQLite数据库存储数据;
* 使用ContentProvider存储数据;
* 网络存储数据;
Android 中的数据存储都是私有的,其他应用程序都是无法访问的,除非通过ContentResolver获取其他程序共享的数据。
摘自:http://www.moandroid.com/?p=319

16.请介绍下ContentProvider是如何实现数据共享的。

一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。

如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
参考:http://www.moandroid.com/?p=319

17.如何启用Service,如何停用Service。

1.第一种是通过调用Context.startService()启动,调用Context.stopService()结束,startService()可以传递参数给Service

2.第二种方式是通过调用Context.bindService()启动,调用Context.unbindservice()结束,还可以通过ServiceConnection访问Service。
在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
参考:http://www.cnblogs.com/feisky/archive/2010/06/14/1758336.html

18.注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。

android中,不同进程之间传递信息要用到广播,可以有两种方式来实现。
第一种方式:在Manifest.xml中注册广播,是一种比较推荐的方法,因为它不需要手动注销广播(如果广播未注销,程序退出时可能会出错)。
具体实现在Manifest的application中添加:

上面两个android:name分别是广播名和广播的动作(这里的动作是表示系统启动完成),如果要自己发送一个广播,在代码中为:

Intent i = new Intent(“android.intent.action.BOOT_COMPLETED”);
sendBroadcast(i);

这样,广播就发出去了,然后是接收。
接收可以新建一个类,继承至BroadcastReceiver,也可以建一个BroadcastReceiver的实例,然后得写onReceive方法,实现如下:

protected BroadcastReceiver mEvtReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if (action.equals(“android.intent.action.BOOT_COMPLETED”))      {
      //Do something
      }
  }
};

第二种方式,直接在代码中实现,但需要手动注册注销,实现如下:

IntentFilter filter = new IntentFilter();
filter.addAction(“android.intent.action.BOOT_COMPLETED”);
registerReceiver(mEvtReceiver, filter); 

这时注册了一个recevier ,名为mEvtReceiver,然后同样用上面的方法以重写onReceiver,
最后在程序的onDestroy中要注销广播,实现如下:

@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mPlayerEvtReceiver);
}

Android系统中的广播是广泛用于应用程序之间通信的一种手段,它类似于事件处理机制,不同的地方就是广播的处理是系统级别的事件处理过程(一般事件处理是控件级别的)。在此过程中仍然是离不开Intent对象,理解广播事件的处理过程,灵活运用广播处理机制,在关键之处往往能实现特别的效果,
在Android 中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。
使用广播必须要有一个intent 对象必设置其action动作对象
使用广播必须在配置文件中显式的指明该广播对象
每次接收广播都会重新生成一个接收广播的对象
在BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理
转自:http://www.dengdeng.name/u/deng/archives/2010/92.html

http://www.cnblogs.com/TerryBlog/archive/2010/08/16/1801016.html

19.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。

简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理
参见:http://hi.baidu.com/%C1%F7%C0˲%BB%D0%DD/blog/item/4e576b7c58d742360cd7dac9.html

http://blog.csdn.net/xuxinyl/archive/2010/12/25/6097560.aspx

20.AIDL的全称是什么?如何工作?能处理哪些类型的数据?

AIDL全称Android Interface Definition Language(AndRoid接口描述语言) 是一种接口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的.AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情:
1. 引入AIDL的相关类.;
2. 调用aidl产生的class.
理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类, 不过在Eclipse中,目前的ADT不支持Bundle做为参数,
具体实现步骤如下:

1、创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。

2、编译AIDL文件, 用Ant的话, 可能需要手动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.

3、在Java文件中, 实现AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.
4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind ()方法来返回一个实现上述接口的类的实例。
5、在服务器端回调客户端的函数. 前提是当客户端获取的IBinder接口的时候,要去注册回调函数, 只有这样, 服务器端才知道该调用那些函数

AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。 由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:

  1. 不需要import声明的简单Java编程语言类型(int,boolean等)
  2. String, CharSequence不需要特殊声明
  3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型.

(另外: 我没尝试Parcelables, 在Eclipse+ADT下编译不过, 或许以后会有所支持).

实现接口时有几个原则:

.抛出的异常不要返回给调用者. 跨进程抛异常处理是不可取的.

.IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。 也就是IPC调用会挂起应用程序导致界面失去响应. 这种情况应该考虑单起一个线程来处理.

.不能在AIDL接口中声明静态属性。

IPC的调用步骤:

  1. 声明一个接口类型的变量,该接口类型在.aidl文件中定义。
  2. 实现ServiceConnection。
  3. 调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.
  4. 在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service). 调用

YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。

  1. 调用接口中定义的方法。 你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。
  2. 断开连接,调用接口实例中的ApplicationContext.unbindService()
    参考:http://buaadallas.blog.51cto.com/399160/372090

21.请解释下Android程序运行时权限与文件系统权限的区别。

apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置。
android系统有的权限是基于签名的。
具体参见:http://blog.csdn.net/Zengyangtech/archive/2010/07/20/5749999.aspx

22.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。

通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性

23.有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%。

24.什么是ANR 如何避免它?

ANR:Application Not Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:
对输入事件(如按键、触摸屏事件)的响应超过5秒
意向接受器(intentReceiver)超过10秒钟仍未执行完毕
Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。
因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成 (或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 — 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程 在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序 对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时 问题。

25.什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?

一般像空指针啊,可以看起logcat,然后对应到程序中 来解决错误

26.Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?
27.简要解释一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver

一个activity呈现了一个用户可以操作的可视化用户界面
一个service不包含可见的用户界面,而是在后台无限地运行
可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信
一个broadcast receiver是一个接收广播消息并作出回应的component,broadcast receiver没有界面
intent:content provider在接收到ContentResolver的请求时被激活。
activity, service和broadcast receiver是被称为intents的异步消息激活的。
一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI
Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于 manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。
它是通过将Intent对象和目标的intent filter相比较来完成这一工作的。一个component的intent filter告诉android该component能处理的intent。intent filter也是在manifest文件中声明的。

28.IntentService有何优点?

IntentService 的好处
* Acitivity的进程,当处理Intent的时候,会产生一个对应的Service
* Android的进程处理器现在会尽可能的不kill掉你
* 非常容易使用

29.横竖屏切换时候activity的生命周期?

  1. 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
  2. 设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
  3. 设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

30.如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?

可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res aw目录中

31.如何将打开res aw目录中的数据库文件?

在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

32.Android引入广播机制的用意?

  1. 从MVC的角度考虑(应用程序内) 其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过 是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一 种补充关系,引入广播机制可以方便几大组件的信息和数据交互。
  2. 程序间互通消息(例如在自己的应用程序内监听系统来电)
  3. 效率上(参考UDP的广播协议在局域网的方便性)
  4. 设计模式上(反转控制的一种应用,类似监听者模式) 转自:http://www.cnmsdn.com/html/201101/1295431222ID9251.html

33.android 的优势与不足

Android平台手机 5大优势:
1. 开放性
在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟
开发性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。
2. 挣脱运营商的束缚
在 过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone 上市 ,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中 的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?
互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。
3. 丰富的硬件选择
这 一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不 会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian风格手机 一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移,是不是非常方便呢?
4. 不受任何限制的开发商
Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之一。
5. 无缝结合的Google应用
如今叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。
再说Android的5大不足:
1. 安全和隐私
由于手机 与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。
2. 首先开卖Android手机的不是最大运营商
众 所周知,T-Mobile在23日,于美国纽约发布 了Android首款手机G1。但是在北美市场,最大的两家运营商乃AT&T和Verizon,而目前所知取得Android手机销售权的仅有 T-Mobile和Sprint,其中T-Mobile的3G网络相对于其他三家也要逊色不少,因此,用户可以买账购买G1,能否体验到最佳的3G网络服 务则要另当别论了!
3. 运营商仍然能够影响到Android手机
在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序。
4. 同类机型用户减少
在 不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于Android平台手机,由于厂商丰富,产品类型多样,这样 使用同一款机型的用户越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各异,就很少有专门针对某个型号山寨机的讨论和群组, 除了哪些功能异常抢眼、颇受追捧的机型以外。
5. 过分依赖开发商缺少标准配置
在 使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个浏览器程序,用户可以选择更多样的播放器,如Realplay或暴风影音等。但入手开始使用默认的程序同样可以应付多样的需要。在 Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中就没有内置音乐 播放器,全部依赖第三方开发,缺少了产品的统一性。

34.android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别。

XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存 中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处 理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。
详细情况请参考 http://blog.csdn.net/Android_Tutor/archive/2010/09/17/5890835.aspx

http://www.linuxidc.com/Linux/2010-11/29768.htm

http://littlefermat.blog.163.com/blog/static/59771167200981853037951/

35.DDMS和TraceView的区别?

DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器

36.Activity被回收了怎么办?

只有另启用了

37.java中如何引用本地语言

可以用JNI接口

38.谈谈Android的IPC机制

IPC是内部进程通信的简称, 是共享”命名管道”的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。

39.NDK是什么

NDK是一些列工具的集合,
NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java 应用打成apk包。
NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so

40.描述一下android的系统架构

android系统架构分从下往上为linux 内核层、运行库、应用程序框架层、和应用程序层
linuxkernel:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。

libraries和 androidruntime:libraries:即c/c++函数库部分,大多数都是开放源代码的函数库,例如webkit,该函数库负责 android网页浏览器的运行,例如标准的c函数库libc、openssl、sqlite等,当然也包括支持游戏开发2dsgl和 3dopengles,在多媒体方面有mediaframework框架来支持各种影音和图形文件的播放与显示,例如mpeg4、h.264、mp3、 aac、amr、jpg和png等众多的多媒体文件格式。android的runtime负责解释和执行生成的dalvik格式的字节码。

applicationframework(应用软件架构),java应用程序开发人员主要是使用该层封装好的api进行快速开发。

applications:该层是java的应用程序层,android内置的googlemaps、e-mail、即时通信工具、浏览器、mp3播放 器等处于该层,java开发人员开发的程序也处于该层,而且和内置的应用程序具有平等的位置,可以调用内置的应用程序,也可以替换内置的应用程序。

上面的四个层次,下层为上层服务,上层需要下层的支持,调用下层的服务,这种严格分层的方式带来的极大的稳定性、灵活性和可扩展性,使得不同层的开发人员可以按照规范专心特定层的开发。

android应用程序使用框架的api并在框架下运行,这就带来了程序开发的高度一致性,另一方面也告诉我们,要想写出优质高效的程序就必须对整个 applicationframework进行非常深入的理解。精通applicationframework,你就可以真正的理解android的设计 和运行机制,也就更能够驾驭整个应用层的开发。

宏定义的黑魔法 – 宏菜鸟起飞手册

Happy define :)宏定义在C系开发中可以说占有举足轻重的作用。底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行。而在更高层级进行开发时,我们会将更多的重心放在业务逻辑上,似乎对宏的使用和依赖并不多。但是使用宏定义的好处是不言自明的,在节省工作量的同时,代码可读性大大增加。如果想成为一个能写出漂亮优雅代码的开发者,宏定义绝对是必不可少的技能(虽然宏本身可能并不漂亮优雅XD)。但是因为宏定义对于很多人来说,并不像业务逻辑那样是每天会接触的东西。即使是能偶尔使用到一些宏,也更多的仅仅只停留在使用的层级,却并不会去探寻背后发生的事情。有一些开发者确实也有探寻的动力和意愿,但却在点开一个定义之后发现还有宏定义中还有其他无数定义,再加上满屏幕都是不同于平时的代码,既看不懂又不变色,于是乎心生烦恼,怒而回退。本文希望通过循序渐进的方式,通过几个例子来表述C系语言宏定义世界中的一些基本规则和技巧,从0开始,希望最后能让大家至少能看懂和还原一些相对复杂的宏。考虑到我自己现在objc使用的比较多,这个站点的读者应该也大多是使用objc的,所以有部分例子是选自objc,但是本文的大部分内容将是C系语言通用。

入门

如果您完全不知道宏是什么的话,可以先来热个身。很多人在介绍宏的时候会说,宏嘛很简单,就是简单的查找替换嘛。嗯,只说对了的一半。C中的宏分为两类,对象宏(object-like macro)和函数宏(function-like macro)。对于对象宏来说确实相对简单,但却也不是那么简单的查找替换。对象宏一般用来定义一些常数,举个例子:

//This defines PI
#define M_PI        3.14159265358979323846264338327950288

继续阅读宏定义的黑魔法 – 宏菜鸟起飞手册

关于社交,有可能这是最全的了

没人带,自学慢,不在BAT怎么学产品?人人都是产品经理联合200+BAT资深产品经理带你学 点此查看详情

当下,社交已经快被做烂了,什么行业都会加一个社交元素,什么人可能都会张口闭口的说我是做社交的,那么你真的懂社交到底是什么吗?真的懂社交的本质吗?本文,将尽量用最白最精简的语言,阐述个人对社交行业的浅理解。

shejiao

到底什么是社交,社交的本质是什么

好问题,一点喘息的机会都不给。

个人理解,社交,剥离开所有所有的其它东西,最最核心的本质,其实就一句话,社交就是时间

好吧我觉得一定会有人反驳我,心里在暗骂这哥们xx吧,为什么说社交就是时间呢,再往下一层来释放,社交其实就是两个人沟通的过程,而这个过程,不就是要付出时间的么。别告诉我你是娜美克星人,碰一下触角沟通完毕。

人与人之间为什么要有社交行为

上面已经说到,社交就是两个人沟通的过程,而为什么要去付出这个时间来做这个事呢,记住人类是比较阴暗的动物,所谓无利不起早,恩,人类做什么事情基本都是有目的的,而这个目的的答案其实蛮简单,要获得等量的价值交换

何为价值交换?举个栗子,我是学生,你是老师,我们两个的社交行为就是在课堂上,我付出时间上课,你付出时间授课,而我的价值是人民币(学费),而你的价值是肚子里的学问,我用人民币交换你的学问在上课过程中,时间刷刷在走,这不就是社交吗?请问还有哪位同学不明白的请举手。

一般情况下,常规的价值交换包含以下一些:利益交换,观念交流,价值分享,食色,寂寞、社会因素,生活需要,找存在感等等。

总之,社交其实是一个互相“交易”的过程,但此“交易”与普通的“商品交易”并不是一个概念。更多的还是等价的交换,如果一方无法让另一方觉得我们的价值交换是平衡划算的,那么也就会打破这个社交平衡,从而造成社交流失。

这次能从本质理解为啥金钱是万能的这句话了吧,金钱可以交换你的任何东西,从而不会让你感到不平衡,从而可以维持长久的社交关系(伪)。

社交的基本公式

这个公式,是之前听课学来的,公式之精湛简直和质能方程有一拼。

A+B+T=R

解释一下,A这里就是一方用户,B其实就是另一方用户,T就是time时间,R就是reward回报。继续释放一下,可以得到以下公式:

个性(优势)+兴趣(需求)+时间付出=回报

A端是每个人都会有的不同个性,这些会是他的优势,个性的优势就跟实体交易过程中的资产类似,是你的筹码。比如我很帅,我很美,我才华横溢,我幽默可人等等。

B端是人的兴趣与需求,也就是一般的社交发起方,比如,我想看到美女,我想听单口相声,这是我的需求,而恰好A端的一位用户的优势就是符合我的审美观,美!那么少废话,开整吧,B就开始勾搭A,自然AB之间形成社交关系(A不搭理你你也没辙)。

个性优势和兴趣需求合起来的中间过程,需要投入时间、精力、金钱等各种要素,也就是成本,所有东西就是建立在社交时间的基础之上,你想他,你花钱,都得用时间吧,这就是社交的过程,简而言之,这也就是社交的本质了。

社交的过程之后产生的就是回报,这个红利回报就是其中一方爽了,另一方嗨了。可能是双赢,可能是单赢,可能是一个赢的多一点,一个赢的少一点。从经验判断,双方达到静态平衡状态的社交,才是有可能维持长久的,单方的压制,一般情况下都不会有好结果(恋爱也是一样)。

整体来看,人类比较正常稳定的社交行为都是通过这样一个公式来产生的。

有特例吗?

有,不多。比如,一见钟情,实际就是两端变为一端了,如何理解,自己想(活该单身一万年)!

回报是什么

万年不变的两个角度:精神或物质的回报。

精神回报更多的是在生理上,满足我们的某些需求(嘿嘿嘿一脸坏笑),同时在心理上,带来虚荣心、存在感、好奇心或者归属感等让你膨胀的持续满足,这个占主要,同时还会有比如满足求知、信息交换等等提升上面的精神回报。

而物质回报相对来说就简单的多了,比如车、房、钱等等,只要是你现实当中可以接触到的,就都可以的。

从前些年的常规来看,物质回报往往更能吸引用户,但是同时也更难,精神回报在去年也开始一个集中爆发,为代表的就是类似高质量的原创文章、大牛下方到民间等等。

社交三要素

“关系链”、“信息” 和 “互动” 。而社交行为,从根本上说,也是这 3 者构成的。

信息的生产会促进用户间互动,而用户间的互动直接影响用户间关系的建立;这样又会使新的内容产生。

关系链

在社交范畴指的是人与人之间相互作用的性质。在于人人之间的关系链建立、维系发展 3 个方面。

以关系链为主要目的,往往旨在获取社交潜在的未来价值。

信息

在社交的范畴指的是内容信息流。在于内容的生产和加工、展现形式和消费 3 个方面。而内容本身又有质和量的属性。

关注内容为主的社交,往往是为了当下获取某一内容,或者消费某一信息或内容。

互动

在社交范畴指的是人与人之间相互作用的方式。根据互动产生的机制,分为条件互动和内容互动。参与模式有一对一,一对多,多对多的互动。并且要认识到互动需要有媒介。

互动为主要目的,往往可以排解无聊,提升自我价值,获取丰富的情绪和心理体验上的回报。

社交产品流程的关键点

社交就是时间,而每个产品,实际就是要占用你的时间的,只不过有的浪费你的时间,有的节约你的时间,这么看来,互联网社交产品也就理所应当的应运而生了。

而纵观整个社交流程,梳理一下核心关键点,可以看到以下一些:爆点、破冰、关系链、社群、控质、粘性、转化、盈利、往复,无外乎如此。

爆点

顾名思义,就是你的社交平台,吸引用户的核心点,记住这个点最好有且只能有1-3个。

市场上可见的社交产品一定是在某方面放得非常大,才会导致海量用户涌入你的产品,而且这种需求放大往往是生活中常见的需求被迅速放大,才会产生这样的效果。

但是也会导致一些灾难性的问题(下面有说)。

试想一个用户被你忽悠进来,本来想玩玩这个,结果一进来看到平台有N个点,找半天没找到吸引他的那个点,不流失等啥呢?

历史上的爆点,微信的免费短信、陌陌的地图社交、Same的兴趣社交、Facebook的熟人社交、小咖秀的逗比范儿、探探的新模式、Snapchat的阅后即焚,等等太多了,文后尽量列一下,这里不多做赘述了。

破冰

万年难题没有之一,永远的单方发起勾搭,对方回复率极其低下,某些情况下这种低下是致命的,不少平台也就这么Over掉了。

这里其实牵扯的因素数不胜数,比如社交勾搭技巧、平台匹配准确率、双方的心情等等,这里各家平台的社交场景不同,社交爆点不同,也就不能一概而论了。

平台唯一能做的,就是尽可能准确匹配双方的硬件条件,而跟人有关的,平台也就无能为力了。

关系链

双方在成功破冰之后,其实就算是建立了某种程度上的关系链,而关系链的建立、维系和发展,又算是一道社交界的难题。

建立就是破冰的过程,如何更好的维系,也是从另一方面直观生死的。如果平台每天的勾搭成功率非常高,但是都转到别的平台去了(你懂的),这种平台在用户心中,其实就已经变成了一种“进货”的工具了,还是有点恐怖的对吧,但事实的确如此,如何解决,详见社群。

而关系链的发展,其实更多的是关乎平台的生命时间,发展越盘根错节,越深入,平台存活时间其实也就是越长的,并且随着时间的推进,越牢靠,伴随着这种牢靠,变现盈利也就会相对容易很多。

社群

又一个万年难题,社群到底是啥?个人认为,社群其实就是一个个小的贴吧,以兴趣点为核心点将平台上的用户通过兴趣点聚合在一起。就这么简单?是的就这么简单,那为什么说是万年难题呢。

社群素质和质量的好坏,几乎决定整个平台的命脉和走向,单个用户之间产生的关系链关系平台生死,多用户之间的社群关系平台命脉走向。

社群固然重要,但是一味的要多是没有用的,贪多嚼不烂,看看现在的微信和qq,有多少社群都是死寂一片,社群活,则平台有气息,社群死,则平台死寂沉沉(这也是朋友圈存在的原因)。

当前最顶级的社群在哪里,我认为是百度贴吧,有人说难道不是豆瓣、天涯什么的吗?注意我的形容词,顶级,而没说社群质量。

贴吧最开始就是非常典型的蓝色超链接,大框框,回回帖骂骂街,之后贴吧也就越来越没落,原因我想应该是人们的时间越来越被其它兴起的产品占有,并且贴吧素质较低(某些,当时,无特指),无带动性等等综合性原因导致。

随着时间又一次推进,贴吧换了换皮肤,请走了几个设计师,风格变得高大上,但是模式还是一样,不同的是融入进了许多互联网思维,和粉丝内容紧密结合,从低谷被生生拉起,越为国内最活跃、最全、最大、最专业的社群平台,Slogan也变成上贴吧找组织,组织不就是兴趣点么,和之前一样的。

而社群的重要性,还和社群带来的价值息息相关。可以促活、粘性、变现、筛选内容和生产内容等等,每个高质量的社群其实就是一个个小的独立国家,有自己的法律法规(吧规),有老板(吧主),小弟(管理),老百姓(用户),人渣(黑名单用户),精神食粮、信仰,几乎应有竟有。运营好了社群,某种程度来说整个平台,你就可以放心的交给他们去整了,一轮一轮的常规用户迭代,几乎不会到死路。

当然,脑子活一点,别死啃一个东西,想想开心网吧,不知道变革和与时俱进,抱歉只有被用户抛弃。不过还是会有特例,那还是我们的百度贴吧,百度就是个神奇的公司,拿下国人互联网的第一出口,拿下这个那么几乎所有第一手资源也就不言而喻的导流进自家产品了,所以我也不知道以后,就算是100年后的贴吧(如果百度还在),是不是还是这种模式还能活的好好的。

控质

控质拆开就是控制质量,有几种方向,平台人工审核、机器筛选、抽检、举报等,不过个人觉得从平台角度来说,最省时省力并且效果最好的,就是利用社群了,相当于你雇佣了许许多多不花钱的小弟帮你盯着,何乐不为,而且他们都是专业的啊,至少比你专业,控制质量,应该会比你好。

粘性

增加用户粘性也是和蛮多因素相关的,比如用户质量、内容质量、赢利点、口碑、用户数量等等,而最简单提升粘性的办法,还是神奇的社群。配合平台的运营手段,进一步的扩大这种效应,所以知道社群有多重要了吧。

转化

如果你已经闯过之前那么多关口,恭喜你已经几乎看到胜利的阳光了。还是通过神奇的社群手段,成功提升平台用户及内容质量,不断产生的新内容和新用户变为新鲜血液,下层有独立用户作为主要支撑(旁枝末节当然还有很多,后文赘述),上层拥有高质量社群帮助维持及筛选,两层的用户也会在不断交替输送(不活跃用户被踢掉),已经变为较成功的一套社交体系了。而随着正向的这种发展,你的市场影响力也会逐渐扩大,渐渐用户量级提升,而你需要做的是牢牢抓住平台最顶尖的社群,是时候适当加一些赢利点进来了。

盈利

这个问题根据场景、目的、平台等等的不同有多重盈利模式,不过纵观当下常见盈利模式,也无外乎流量变现、增值服务、会员费、商品售卖。而前两种几乎是当前主流APP的赢利点,不多说。

会员费这个比较有意思,好像是为社交平台专门孕育而生的,前提还是你控制好平台用户质量和内容质量(贫了),只有这,用户才有可能心甘情愿并且前赴后继的付费加入,不过这个风险也是最大的,极有可能用户从此弃用,谨慎考虑。

商品售卖,电商平台是最多的,不过我想,通过社群或者分析独立用户属性及喜好,进行垂直的商品推荐,赚取CPS费用,如果算法得当,也许这能变为平台的主力收入。不过同样慎用,算不准效果不好不说,把用户整烦了,分分钟卸载也是可能的。

总结

盈利完毕后其实也就是一个完整的社交平台流程了,可以回归往复到关系链环节再次优化摸索,也可以继续侧重社群,不断往复,不断更迭,不断盈利,当然愿望总是美好的,现实总是残酷的。

社交产品的必备成功因素

  • 尊重人性:高效性、刺激感、互动性、可隐蔽感等;
  • 好的产品:产品设计+商业模式+推广等;
  • 好的团队:战略、运营、执行等。

这三点,发挥到淋漓尽致的,个人觉得前无微信后无来者。

够轻便吧(高效),漂流瓶摇一摇有意思吧(刺激),朋友圈刷的还行(互动),消息看了可以当做没看(隐蔽),第二第三就不说了,有张老板把控,也都是有目共睹的。

社交分类

移动互联网使社交网络进入了一个新阶段。约炮神器,拍照神器,兴趣小组,各种内容分享;社交应用目前分门别类,花样别出。可以依照关系强弱来分为熟人社交、陌生人社交,有按照领域分为各类垂直领域社交,也有按照信息承载方式分为图片、视频社交。并且跟社交的动机也有着巨大的关系,动机是多样的,并且变化的。身份,背景,不同情况扮演的角色不同,社交的动机都不一样,可以把握的是人本质的需求。

熟人社交

Facebook,是基于”I know U“的社交图谱,但是后期由于用户规模过小(你想想你现实中能认识多少人呢),所以Facebook研究各种模型,将有同一兴趣爱好或者同样兴奋点的用户撮合到一起,以至于产生了如此之大的用户规模。其实这也跟Facebook自己观察的用户留存有关,防止用户过快流失,521原则等,不在讨论之列。并且Facebook简直是互联网社交最牛逼的存在,目前几乎所有社交都是基于陌生人转向熟人社交,而只有Facebook是基于熟人转向陌生人,当然国内也有,比如某游戏(ren)投资(ren)网。

微信,熟人社交不得不提的就是微信,而微信其实也是基于qq导过来的前期用户,而追根溯源,qq最早不就是基于陌生人嘛,不过可能有些牵强附会了,所以将归类到熟人社交,应该也不辱身份。

一开始微信主打“免费短信”,紧接着出现语音消息功能,沟通的效率立即变高了,沟通的场景立即变丰富了。然后出现了“附近的人”和“摇一摇”,打破了这个封闭的领域,开始可以和陌生人有沟通。后来又出现了朋友圈,人们的信息开始沉淀下来。再后来出现公众号,公众号又分为订阅号和服务号,这个时候微信开始把那些企业、社群、比较大的媒体吸引进来。此后,微信实现了爆发性的增长,而后布局红包功能,意图在微信支付,为商业化、内容订阅、线下等做铺垫。每每想到整体进程,不由一身鸡皮疙瘩,如此清晰之走线,微信的成功谁还敢说是偶然?

陌生人社交

轻兴趣+轻社交

对用户发布的内容(图片、视频)进行标签化分类,再以兴趣标签为索引向用户进行个性化的内容推送/引导。有些应用会通过用户自定义标签的形式来完成,有些则通过后台算法完成匹配。

给用户提供各式类别的标签。这一工作可能会在用户初次使用应用时完成,也可能贯穿整个软件的操作过程。

轻兴趣+重社交

结合LBS,延续贴吧、豆瓣小组、QQ群的优良传统,在独立应用下创建多个兴趣群组,线上对话对组织线下兴趣活动起到支持作用。

重兴趣+重社交

专注于单一兴趣关键词,围绕该主题,为具有特定需求的用户打造高浓度的兴趣社交平台。

这里就不做产品举例了,文末有彩蛋,放在那里展示了,如果有想看的朋友直接看彩蛋即可。

提升空间

对于用户间关系这一层面,由于互联网的渗透,除了利用多种方式建立用户间关系意外,还要开始发展一个新的关系,可以称之为 “亚关系”。亚关系这里指的是那些对于一般用户来讲,不需要进行对他人的身份识别,而仅仅以获取某一特定内容或产生某一互动行为作为目的。即我不需要知道你是谁,你的身份是什么,你在哪里;只需要得到我想要的结果就行。

对于信息生产,需要再进一步情感化、智能化和个性化。人的感性诉求,需要通过更多情感化设计来捕捉和满足。而人的理性诉求,需要有更多智能化设计和体验来实现。

对于用户间的互动,我们要借用更多新媒介。新的智能硬件设备充分利用,实现用户的远程多维互动,或者模拟物理上的互动。同时一些生物技术的利用都可能产生不一样的效果。

如何区隔——陌陌

一个非常经典并且后果比较灾难的例子,从事社交方向的朋友应该或多或少也都听过。

上文说了,在爆点之后,可能面临的问题就是大量用户涌入,有人说这是好事,可我并不这么看。

约炮神器“陌陌”,大家现在提到它,还是觉得是一个约炮神器。其实“陌陌”一开始有着非常稳定的金字塔结构。

  • 塔基:金字塔底层的是所谓的屌丝用户,屌丝男、屌丝女;
  • 中层:中间有着优质用户,尤其以女性最为珍贵(1个优质的女性用户可以带来7个男性用户);
  • 塔尖:最高端的是一些大V、高富帅等。

金字塔已经摆起来了,这时候的金字塔结构是相当稳定的,它内在的生态是平衡的。但是所有底层的屌丝用户会不断地去搭讪和追捧中间的优质用户,满足了他们的虚荣心。中间的优质用户又可以筛选出顶层的高富帅,相当于绩优股的角色。顶层的用户又会发现,真的有很多高颜值、好身材的妹子在身边。紧接着一夜之间,约炮神器的名声传出去,可以让附近几百米变成附近负5米。

于是,很多屌丝用户涌入这个应用。带着饥渴的眼神,不断地对中间优质用户说“约吗?约吗……”。这样久了之后这种行为从“追捧”成为“骚扰”,优质用户做筛选的成本变高了,对她们而言这个产品的价值就没有那么高了,于是纷纷开始逃离。同时又有失足妇女或者特殊的职业的女性,如酒托、饭托、包厢里的公主不断涌入。社交的价值出现改变。顶端的高富帅意识到想要约到优质女性的效率变低了,高富帅用户开始流失,于是这个金字塔开始出现失去平衡、崩塌的局面。

当社交产品的规则约束不了它的海量用户,将会使得它的生态失去平衡。

那么问题来了,如果我是当时陌陌的产品经理,我将如何解决?

陌陌现在过得确实很辛苦,洗白的过程很痛苦,也很漫长,并且也投入了不小的成本,好再效果还是不错。

在两个不对等的阶层当中,每日限量进行搭讪,超出限额,可直接引导进行付费,请注意,是在不对等阶层,比如屌丝搭讪高质量。而屌丝搭讪屌丝,还是不限量的。

这样既控制了用户间隔一边倒的趋势,而也进行了适当的变现测试,并且底层用户量级也是非常大的,较小的将风险控制在可控范围之内来解决这个问题。

当然问题和风险犹在,慢慢测试逐渐印证摸索即可(貌似当时也投了陌陌简历,无奈并没有电话)。

支付宝为什么要做社交

这应该是最近比较火的一个话题,但是我觉得这句话的逻辑有问题,不是支付宝为什么要做社交,应该是“为什么支付宝不得不做社交”。

看似相似,实则不然,前者是主动,后者为被动。

简单略过不难看出,支付宝已然变成当前手机装机量前几的APP,并不是它粘性有多么的大,而是支付宝为刚需,在淘宝如此巨大的体量掩护之下,支付宝为唯一支付方式,它的体量已然就显而易见。

如此简单的问题我等小民都能看出,马云爸爸岂能看不出来,而一旦用户仅仅只是把你作为一个工具,虽然你是刚需,那么也是会存在风险的,虽然这个风险在当前哪怕没有一点苗头,都是搞互联网的,瞬息万变,尤其是电商更加使然,今天是淘宝一家独大,谁能证明十年以后淘宝不会消失呢,所以伴随淘宝的消失(百年以后?)和流量的下滑(也许就在不远的将来)导致的直接问题就是支付宝的下滑,而为了阻止这最差的一切结果的发生,只好将大招社交搬到支付宝来企图维系住用户。

那为什么不把支付宝的社交功能放进当前的淘宝里呢?

我觉得这问题得从场景出发,首先淘宝已经有社交的对吧,比如旺信、阿里旺旺,但是场景是买卖双方的沟通工具,虽然也是社交,但是附加价值并不大。而淘宝去年也上线了问大家功能,也是问答形式的社交,这种就不算是即时社交不在本文讨论范围。再去细化的看,淘宝上线了淘宝直播,直播也是社交手段,淘宝来做也是在试验阶段,短期不太可能变成淘宝的社交主力,在首页的位置比较靠后。社区,也是去年大力再推行的,但是围绕的都是商品,而不是人,所以依然是购物场景,而且也不是即时社交,社区社交的模式,和传统理解的也是不一样的。综上,无非当下就四种合理的社交方式,只有旺信才是用户理解的即时社交,购物场景。致命的问题是,这种社交场景其实是在商业的羽翼之下,几乎不可能从这种场景得到的用户,转移到现实生活中或者转移成传统的朋友。所以也就不难理解淘宝为什么不得不做社交了。

那么为什么一定要放到支付宝里呢,之前说了,从理论来说,淘宝和支付宝的装机量应该近似1:1这么个比例,而且装机量非常大,所以两边就算是同起点。淘宝里的旺信切陌生人社交,场景是购物,支付宝里的社交切熟人社交,场景和微信类似。

也就是做的一次被动的预付,假设在不可预见的将来,淘宝消失了或者阿里转型做别的去了,支付宝最好还能存在于用户的手机当中,当成日常的沟通工具也是不错的选择。

其实倒还好,从用户立场来说,哪个平台都无所谓,能用,好用,有用就好了,不过微信优势实在巨大,支付宝得拿出点新货来。

年初的集五福真的是逆天的活动,佩服的五体投地。

电商社交与电商社区

电商社交与社区,能真的有用吗?

答案显而易见肯定有用,不然做他干什么呢。

当下市场做的最好的是两家,但是这两家切入的场景和手段都不一样。第一个是淘宝,社区模式,第二个是京东,购物圈。前者没什么好说的,传统社区模式,以商品聚类用户,增大APP用户粘性及活跃,捎带手给点转化引发购买行为,这是个比较保守和传统的做法,无可非议。

京东这个就有意思了,网上的文章也不少,简单介绍一笔带过。购物圈是京东丢在微信里的一个入口,用户购物后或者可以直接从京东微店分享到购物圈当中,且分享的商品不止好友能看到,其它用户也能看到。重点是这个其它用户,微信或者是京东方面没有人给出过具体这个其它用户是怎么筛出来的。

个人推测,京东根据有相同购买行为的用户,并通过微信结合一般生活场景,推测出每个人的喜好与本质,通过算法匹配连线,也就是精选模块。有意思或者说是可怕在哪儿呢?京东将购物社交场景和生活社交场景连到一起了,他知道你的生活喜好或者相关的标签,可以根据你生活的想法来去给你推荐,这样的话,不管从人性来说,还是从成功率来说,都远比淘宝独立做的社区要可怕许多。我不知道微信讲数据共享到什么地步,如果权限很高,那也不得不说京东是心机boy了。

这个如果做好,京东联手微信超越淘宝也不是不可能的事情,我为何如此口出狂言,并没有,仅从当前市场及人性角度出发进行推测,也可能是胡说。

去年,Facebook收购了Altas 公司,这家公司是一个老牌的DMP,除了有线上数据,还有些离线的数据,包括部分用户的信用卡的交易数据,这帮助Facebook构建一个高可信度的用户数提供了线上线下的互补。

而Facebook约97%的收入都是广告贡献,恐怖的是这家公司的增长率高达40%+(15年Q1),是Google的4倍,这么搞下去Google是要被Facebook的广告超了,造成这一切的根本,从广告的根本展现原则就是不同的。

Google是被动展现,Facebook是主动展现。

何为被动,在你搜索的时候,与你自身是没有关系的,跟你搜索的行为是有关系的,也就是两者可能会发生冲突的,比如我搜玩具,那么很可能我只是想看看,并不想买,点击进去,如果是CPS模式,那么没发生购买行为的话实际是没有收入的,效率较低。主动展现是跟你人有极大关系的,我日常的浏览,人的喜好,都被记录在案,而根据这些东西展现的广告,你能不毛骨悚然嘛。

所以Facebook已经是个比较好的例子,但是他只做了广告,微信类似Facebook,但是他几乎不做广告,转向另一种盈利模式,携手电商,共享数据,进行基于人的推荐广告,进行吸金。其实还存在另一个问题,就是用户在微信里购买的习惯其实还没大量养成(相比淘宝等电商平台),所以这事成不成,还在于此。

京东的主APP迟迟暂无动作,只有简单的发现功能,这个跟描绘的相关场景和当前的产品相差甚远。更有意思的是用户在京东APP场景的购物习惯其实已经被养成了,由此不难思考到,如果京东APP做个社区,采用微信共享的用户数据,结合京东本身的购买行为,进行精准推送及匹配,直击你的内心,恐怕这就有意思的多了(淘宝的社区也是完全基于你的搜索行为,某种程度来说是不敌这种理想模式的)。

社交的坑

坑来了坑来了,简单说下看到的或者是遇到过的坑。

并不一定看到的越多越好

代表场景,婚恋社交。婚恋诸如百合、世纪佳缘、珍爱、友缘等一些公司为代表,为何说不一定看到的越多越好呢。首先,如果你是个男的,要追个姑娘,你希望让全世界都看到这个姑娘吗,肯定不希望,看到,就有可能有两种选择,一种是追一种是不追,从数学角度来说,两者的概率是相同的。如果有10万人都看到了你喜欢的姑娘,理论来说你会多5万个竞争对手,我去,好好想想吧。

其次,从数据来看,这种婚恋社交平台的用户年龄层偏大,所以不得不联想到一点,就是可不能让熟人看到我在这平台上,这要是让别人看到了,丢人丢到家了。两种心里其实是矛盾的,他想有更多的人来勾搭他,那就必然是要有更多的展示,而他又不想有更多的展示,这是一。第二,一般用户来说,更多的想看到自己喜欢暗恋的人的动态(翻暗恋人朋友圈微博的同学可以去面壁了),而那个人当然不想让自己过高的曝光,所以林林总总,如何取一个平衡,才是你该做的。

少不一定是好的

什么叫少,指的是核心亮点的功能。还记得上面说的爆点吗,功能一定要少而精,精而靓,这也存在一个取舍平衡问题。

探探举例,看脸翻牌子聊天,就这一个爆点,也很轻,按理说应该不错的对吧,事与愿违。为什么呢,曾经我连续点了一周左右,每天一百个左右吧,最终统计下,配上对的大概二十来个,说话得到回复的大概五六个,对话超过十句的一个,转到微信的没有。你是一个社交平台,我是个猎人,猎物让看不让碰,我还要你何用?所以也是个平衡性问题,如何取舍拿捏,看你。

范围越大考虑的越多

范围,指的是社交范围,最近看到过一款全球性交友的平台(全球除了中国),是咱们国人做的,而有个国人比较不在意的问题在国外来说是灾难致命的问题,那就是宗教信仰。

如果你做的是一款全球性范围的平台,那么这两个问题往往是最容易被忽略的,记住,万不可用这俩开玩笑,要命的事。

赢利点不要作(zuō)死

这啥意思,盈利点不都是作死的存在吗。不然,盈利,可以,谁也没拦着,但是个人推崇的盈利模式是提升体验的盈利模式。比如原来只能用静态头像,付费之后可以用gif了(我胡说举的例子别较真),这就叫提升体验的赢利点。

而有的平台,将赢利点放到作死的地步了。51job,招聘平台,某种层面来说也是社交方向对吧。而他家有什么好作死的呢,那就是我投的简历,要看谁看了我的简历,居然要开通vip,心中一万只羊驼飞过。有人说了这有什么不对的吗?好吧,对此我只有请你出去。作死,就作在他把网站应该提供的基础功能卡到付费的地步了,我投简历,看谁看了我的简历,这不是理所应当应该提供的基础功能吗?一旦你把基础功能都拦住了,那用户里暴走也就不远了。试想,如果百度的搜索,每搜一次1分钱,开个包月十块钱免费搜,必死。

百度如果加盈利模式,比如付个十块钱一个月,商业推广就不显示了,我相信这个一定是有付费用户群体存在的,而还不损害非付费用户人群的利益,并且不影响基础功能,用户还有可能是乐着给你钱的,何乐不为(失业ing百度给个offer呗)?

坑还有的是,不知不觉已经敲了这么多了,也就不易列举了,推荐一篇文章,感兴趣的朋友们可以看看《社交APP的18种常见死法》。

好啦好啦结束了,真的非常感谢能看到这里听我胡说这么久的朋友,本文有些观点可能由于个人能力限制及眼界知识面不够宽都是错误的,也还请各位多多指出,在此感激不尽。先谢谢大家了。

答应你们的彩蛋

当下社交APP的细分:

  • 极简/即焚社交:微信、Facebook、snapchat、Blink、呵擦么、FRANKLYCHAT 、YO、flares、emoji
  • 匿名社交:羞小白、友秘、抱抱、yikyak、秘密、悄悄话、乌鸦、蜂蜜、耳语、ROOMS
  • 校园社交:超级课程表、黑白校园、11点11分、Notebowl
  • 泛陌生人社交:陌陌、微聚、摩擦、遇见、么么哒、skout、Badoo、Mico
  • Tinder类:Tinder、探探、向右、Aloha、约你
  • 视频社交:秀色、yy视听、微拍、女生派、9158、网易CC(游戏+美女直播)
  • 电话/语音社交:比邻、语玩、聊聊
  • 同城社交:美丽约、爱吧、同城秘密搭讪、今日有约、简简单单、SAYHI、单身在线、酷聊
  • 情侣社交:小恩爱、微爱、QQ情侣、恋爱笔记
  • 游戏/娱乐社交:碰碰、陌游、LINE PLAY、对面、友加、达答(答题)、炼爱、贝贝
  • 半严肃社交:心跳(兴趣匹配)、又又(二度好友)、友寻
  • 婚恋社交:世纪佳缘、珍爱、百合、花田、有缘、心动婚恋
  • 附近社交:Sobrr、咻、biu、FireChat、meetup、MISS、克鲁
  • 职场/商务/身份社交:LinkedIN、脉脉、会会、朋朋、conspire、名片全能王(加入社交)、优士网、海丁
  • 垂直社交:车轮、车星人、ZANK、BLUED、GAYPARK、拉拉公园、theL、半次元、次元、juju、、gogobot(旅游社交)、投友圈、雪球网、fanatix(赛事)、Dr.wine
  • 弹幕社交:TUTU、槽厂、Acfun、Bilibili
  • 图片/声音/文字社交:啪啪、NICE、密友圈、逗萌、拍信、一半、我的、TOP、个性网、P1、tumblr、path、Pinterest、INSTAGRAM、frontback、tiiny
  • 群聊社交:派派、微米、群群、友群
  • 宠物社交:宠物说、溜溜、闻闻窝、爱夜蒲
  • 运动社交:咕咚、酷动、keep、薄荷
  • 随机聊天:meowchat、叽叽、随喵
  • 文艺社交:片刻、火柴盒、豆瓣(各种)、Same
  • 干事社交:请吃饭、约饭、请你看电影
  • 问答/知识:知乎、果壳、Quora、Brainly
  • 邻里社交:NEXTDOOR、叮咚社区
  • 有偿社交:宠爱、快约
  • 女性社交:薇蜜、辣妈圈、大姨妈、元子
  • 造星/明星社交:捧丝儿、蜜乐、星云
  • 短视频社区:美拍、微视、VINE 、8PM、秒拍
  • 大公司社交:来往、易信、吧拉(新的淘宝做的买买买same)
  • 美女社区社交:女神计划、我不是女神

本文为本人输出的第二篇文章,下期,个人准备写一写数据方面的事情(如果还有时间的话),点此查看本人的首篇文章《总结 | 完整的产品生命线知识垂直整合》,再次感谢。

PS.这篇文章的诞生实际是因为裁员的关系,不得不又出来找工作。最近面试了一家比较不错的公司,方向是社交方向,因为之前做过两年多的社交泛方向,所以有幸得到了面试机会。不过由于前些日子发烧住院外加准备不够充分,而且近几个月并没有从事社交方向,故此面试是一塌糊涂。我承认不甘心,回家决定从头到尾好好整理一下之前琢磨的关于社交的一切,才有的这篇文章的诞生。

 

作者:MysTic(微信号mystic326531548),3年产品经理工作经验,失业中,寻坑,坐标北京。

本文由 @MysTic  原创发布于人人都是产品经理。未经许可,禁止转载。

腾讯2014暑期实习笔试总结

<

div id=”content” contentScore=”3469″>4月12号在清华大学参加的笔试,状态不是很好,答题答的懵懵懂懂的。晚上参加微软的在线笔试又被虐得惨不忍睹,4道题答对了一道。。。周一去阿里面试就是被虐的节奏,回来之后就跟大老板开会,一直到今天晚上十点左右才把大老板布置的任务完成的差不多,明天估计要开始赶paper了,今晚是最近最后有空的时间了估计。。。

腾讯的笔试题型主要就两类,一类是不定项选择题,一类就是填空题。到现在我就只记得印象比较深的四点了。。。

相关阅读:

百度2013校园招聘笔试题 http://www.linuxidc.com/Linux/2013-01/78272.htm

百度2013校园招聘研发面经 http://www.linuxidc.com/Linux/2012-11/74057.htm

2012百度实习生招聘面试题 http://www.linuxidc.com/Linux/2012-10/73240.htm

百度2011.10.16校园招聘会笔试题 http://www.linuxidc.com/Linux/2012-10/72976.htm

百度2012实习生校园招聘笔试题 http://www.linuxidc.com/Linux/2012-10/72413.htm

百度垂直搜索部门实习面经 http://www.linuxidc.com/Linux/2012-10/72412.htm

百度2014校园招聘笔试题(长沙站) http://www.linuxidc.com/Linux/2013-10/90817.htm

  1. c++的sizeof题目:具体数值记不清楚了,结构比较有印象

int A(char a[10]) { return sizeof(a); }

int main(){ char a[10]; int result = sizeof(a) * 10 + A(a) * 2; }

这题主要考察 数组名以及指针的区别,我在前面的文章《c++中数组名与函数的区别》中已经有所提及了。

主要原因是数组名a在传入到函数A中时已经失去了他的数据结构内涵并且退化成为了一个指针。所以结果应该为(设为32位机器)10 * 10 + 4 * 2 = 108。

  1. 二叉树的定义:

维基百科中二叉树的定义是:二叉树是每个节点最多有两个子树的树结构,所以一个单独的节点也可以被称作一棵二叉树。.

  1. 概率题:随机取三个球放到四个瓶子中,瓶子的最大球数是2的概率是多少。。。

应该挺简单的。。。但是我不会。。。回头要补习下概率论。。。

  1. 梅氏砝码问题:

用四个砝码称出1 – 40的重量,这四个砝码的值为多少?

有个同学的思路还行,但是仔细推敲还是会有点问题:

解决思路 :

1克的法码是无论如何要用的;

其次需要准备的法码设为x克,就可以称x+1克和x-1克。由于x-1克是在1克的基础上继续加1克的重量所以 x-1=1+1 ,即 x=3 。根据上式可以称出 1、2=3-1、3、4=3+1克。

把要准备的第三个法码社为y克,由于第二个法码可以称到4克,所以又可以称y-4、y-3、y-2、y-1、y、y+1、y+2、y+3、y+4克的重量。由于y-4是在4克的基础上继续加1克的重量,所以 y-4=4+1。即 y=9。因此可以称出1、2=3-1、3、4=3+1、5=9-(1+3)、6=9-3、7=9+1-3、8=9-1、9、10=1+9、11=3+9- 1、12=3+9、13=1+3+9 。

再把要准备的第四个法码设为z克,可以称从z-13到z+13。和前面一样、z-13=13+1 ,所以 z=27。因此可以称出到40克的重量了。

也就是说、只要分别准备1、3、9(=3的平方)、27(=3的立方)克4种法码,就可以称出从1克到40克、每一次加1克的重量。

梅氏砝码:若有n个砝码,重量分别为M1,M2,……,Mn,且能称出从1到(M1+M2+…‼/div>

译文|产品设计实习生面试指南

没人带,自学慢,不在BAT怎么学产品?人人都是产品经理联合200+BAT资深产品经理带你学 点此查看详情

「我们查看了你的作品集,诚挚邀请你参加我们公司产品设计实习生的面试。请问你下周什么时间有空呢?」

shixishengmianshizhinan

一看到这封邮件你就脉搏加速,瞳孔放大甚至有点流口水:你已经寄出很多求职信,提交了很多求职申请,最后--终于如愿!你在成为一个羽翼丰满的产品设计师之路上跨出了虽然很小,但是却很有意义的一步。

但是他们会问你什么?你应该如何尽全力的准备呢?

学生贸然进入产品设计领域是比较困难的。一些有图形设计或者具有艺术学历的产品设计师也都是跌跌撞撞地走进这个领域的;另外一些则是自学成才。

无论是哪种方式,数字产品设计依然是新的领域,对于那些充满好奇心的学生来说资源很少。

高中时我甚至都没有听说过产品设计行业。我了解过 Web 设计领域,但是坦白地说,我并不擅长这个,无法想象它能应用在哪些地方。

随着时间的推移,我在一家手机 app 创业公司进行设计实习,积累了足够的设计经验来找到自己的本心。在那里,我第一次体验到了产品设计,我爱上了和产品经理、工程师和 UI 设计师们合作解决复杂问题的感觉、以及实现产品从无到有的状态。所以我义无反顾地选择了这个行业。

之后那个夏天我加大了自己申请的策略,向超过 50 家公司投递了简历。其中有五家公司对我有兴趣。这五家之中,有三家小型科技公司立刻面试了我。

但是,我去那几家公司面试时根本不知道他们会问些什么,我表现的不好,所以那些为我敞开的门又很快地像它们刚打开那样关上去了。

Evernote 是第四家对我有兴趣的公司。虽然我搞砸了之前三场面试,但是在与 Evernote 设计师电话面试的时候,因为对大致的要求有了一些了解,所以表现的还不错。

在那个夏天我去 Evernote 产品设计岗位实习。因为有了更多实习经验,接下来的那年夏天我拿到了 Facebook 产品设计实习的 offer。现在我在 Facebook 担任全职产品设计师一职。

作为一个学生,我经历过很多家硅谷大公司的产品设计实习岗位的面试:Google、Facebook、Mozilla、Quora、Groupon、Dropbox 等等。如果问我感触最深的是什么,那就是各大科技公司产品设计的面试流程都很类似,通常都包括下面的所有,或者是部分组合:

  1. 电话面试
  2. 作品集审查
  3. 设计任务
  4. App 评判

让我们更加深入地了解一下每一步吧。

1. 电话面试

电话面试能够让面试官更好的了解你,更好的浏览你简历上所写的东西。你可能会被问到:

  • 你的个人背景?
  • 你是如何进入设计领域的?
  • 为什么你对所面试的公司感兴趣?
  • 你做的项目中最喜欢哪个以及,为什么?

在电话面试中,声音要有激情。同时也为面试官准备一些问题。试着问一些有关公司具体情况的问题,那些不是很容易在 Google 搜索中找到答案的问题。面试官会从真实可信数据中解答一些常见问题,但是问一些封闭问题可能会影响你的候选资格。

准备第一次 Facebook 电话面试的时候,举个例子,我发现 Facebook 会定期举行实习生编程马拉松(hack-a-thons)活动。所以在电话面试的时候我和面试官进一步探讨了一下编程马拉松:它们究竟如何工作?在编程马拉松活动时,实习生完全忽略他们的夏季项目这样好吗?谁负责审查最后的项目?

这些问题能够表现出你真正的兴趣。同时也告诉了面试官你是下了功夫并且十分在乎实习机会的。

如果面试官认为你的个人背景和兴趣比较适合实习,那么下一环节通常就是你过去工作的一个展示。

2. 作品集审核

这一步你会和设计师直接对话。

通常情况下,审核将包括对你做过的三四个项目作品的深入了解。作品集审核的关键在于帮助设计师梳理你的设计流程,了解你提出了什么样的问题和你考虑了什么样的解决办法。

简单来说,面试官想知道你是如何接近设计的。你可能会被问到这样的问题:

  • 你想要努力解决什么问题?
  • 你曾和谁组队搭档?
  • 你做过哪种调研,有没有例子?
  • 为什么你选择那种设计方案而不是这种?
  • 应该权衡哪些东西?
  • 在设计某个产品 X 时你遇到了哪些挑战?
  • 如果你有更多时间在某个产品 Y 上,你会做什么改变?
  • 如果你在一个确切的设计问题上卡住,你会如何克服它?

作品集审核中,一个主要任务就是在你的设计流程中展现出你的意向,来表明你思考每一个设计决定都是很细心的,无论是高级产品特性还是一个按钮的视觉造型。

清楚地描述你的逻辑根据。武断地设计决定经不起作品集审核的仔细检查。

logic

确保自己能清晰地表达自己的设计决定。在作品集审核中,你也应该深思熟虑地以批判性的眼光看待自己的设计。没有哪一款设计方案是完美的。反观自己的项目,然后想一些如何提高它们的建议。

许多公司认为产品设计有三个基础:

  1. 视觉设计:如何改进你的设计?它们是否感觉起来有好的工艺和改进?它们是否美观的和人心意?
  2. 交互设计:你能凭直观设计出端到端的用户流吗?你合理地考虑了边缘情况吗?在你设计的 app 中,如何简单的从 A 点到 B 点?
  3. 产品思维:你要努力解决什么样的问题?你为谁而设计?哪些特性应当包含在你的产品中,为什么?

作品集审核能够帮助面试官衡量你在这些领域的强项和弱项。或许你在更适合视觉设计却缺少交互设计的能力。或许你是个稀奇古怪的产品思维者却不能在现实中创建原型。但是这都没问题!你还只是个学生。面试官不会很期待你在产品设计的每个方面都出众。勇于承认自己的弱项以表谦逊,这是任何一个设计师都必不可少的素质。

为作品集审核做好准备是关键。在面试的时候,我经常发现自己会紧张急躁地展示自己作品集每一个项目。列的一些要点会防止我跳过重要的部分,同时也会让我渐渐慢下来平静下来。

你列的要点应该侧重每一个项目具体的设计流程,详细阐述它们运行错误和运行正确的情况。深刻反省你预计出现的每一种情况。写下所有自己能记得的设计流程。让一个朋友模拟面试你。准备,准备,准备!

如果作品集审核进展顺利,那么你就会进入设计任务阶段。

3. 设计任务

传统的设计任务都会遵循下面这个模式:

请为需求 X 或者解决 Y 问题设计一个界面/物品/产品。

当场进行设计任务自然会更加吓人。如果说作品集审核是要充实你过去的设计流程,那么设计任务则是要求你实时实地的展示你的设计内涵思想。

一些我曾遇到的任务:

  • 设计一款采集高质量电话号码的 web 表格。同时,如果你说电话号码,某个人会接到电话。
  • 为搜索引擎设计主页。
  • 展开头脑风暴,使用 Kindle 电子阅读器屏幕的材料设计一款产品。

每一位设计师都有他们自己的设计流程,所以我不能准确的告诉你在设计任务中如何应对。但是我建议可以思考一下你在为谁设计,快速地勾勒出许多不同的选项,并分析这些选项之间的权衡之处。在完成一个彻底的全局思考之前,不要在交互或者视觉细节的选项上陷得太深。

我曾是被要求设计一款手机 app,从而能更简单地为餐厅的顾客分开账单。最开始进展的不错。我很快地为服务员进入账目收据勾勒出了一个设计选项。然后另外一个选项是用户手动输入数据。但是在结束全局思考之前,我沉迷于这个选项的设计,在细节上陷的太深。(布局应该是什么样?版面设计如何工作?)

我在视觉细节上浪费了时间,结果导致我没有足够的时间思考其他类型的方案(例如,用顾客的手机为账单拍张照)。那次面试的第二周我收到了面试官的拒信。但是回想这件事,设计任务方面给我上了宝贵的一课:面试官更关心你全局思想的探索而不是你的细节追求。

detail

在深入思考整体设计之前,不要陷入到视觉设计细节中去。

在设计任务环节最至关重要的是展示你的想法代替技巧。所以不要害怕想一些疯狂天马行空的点子。询问你的面试官一些问题。不要假设任何事情。并且要记住,头脑风暴和分析高级想法比探索不同的按钮样式要更加有意义。

谢天谢地,如此高压的设计任务并不是每次面试流程都有的环节。或许,你会被问及一些 app 评判问题。

4. App 评判

选择一款 app,任何 app 都可以。但至少确保这款 app 你了解的很清楚。

app 评判环节主要是为了分析你的产品思维技能。你会带领面试官走进你选择的 app。在这过程中,面试官会打断你并问类似这样的问题:

  • 你认为这款 app 的用户人群是什么?
  • 这款 app 企图解决什么样的问题?
  • 它如何解决问题的?
  • 你最喜欢这款 app 的哪些特性,为什么?
  • 你最不喜欢这款 app 的哪些特性,为什么?
  • 你认为为什么设计者会做出决定 X?
  • 某一特性的关键是什么?它这样增加特性有什么价值?
  • 你会怎么提升这款 app?
  • 这款 app 的竞争对手有哪些?
  • 这款 app 在哪些方面做得比竞争对手好?哪些方面比竞争对手差?

在 app 评判上运筹帷幄比较困难,因为这需要你有强大的产品嗅觉。我能给出的最好建议就是练习从更高层面分析 app。忘掉颜色、排版和按钮设计,取而代之,深入思考app 提供了哪些价值。并且思考app 的一些特性如何与其整体价值相平衡。例如,Snapchat 就是致力于解决与朋友实时分享的问题。所以他们就做出了一些很棒的特性例如 Live Snapchat 作为大家分享的主要内容和直接在聊天过程中发送 Live Video。

总结

产品设计面试很难。这样的面试压力很大,不限成员名额,并且你在不断接到拒信的同时却根本不知道自己哪里做错了。

但是面试产品设计实习生就像其它任何技能一样。花时间多练习,你就会有所提高。面试一些你没有意愿在那里工作的公司是无关痛痒的,只是去锻炼你的面试技巧。

在你开始每一场面试前做好准备的笔记。尤其是在作品集审核环节。我发现列出每个项目可以谈及的关键点十分有帮助。这会防止你因为紧张跳过重要的部分。

最后但是并非最不重要的一点,设计社区很小并且联系紧密,只要你有勇气问问题,人们是很愿意帮助你的。

 

原文标题:A Guide to Interviewing for Product Design Internships

原文作者:Andrew Hwang

译文出自:掘金翻译计划

译者:iThreeKing

校对:邵辉Vistacirclelove

本文由 @稀土君 原创发布于人人都是产品经理。未经许可,禁止转载。

原来应用号是这么回事!但真的可以干翻应用商店吗?

没人带,自学慢,不在BAT怎么学产品?人人都是产品经理联合200+BAT资深产品经理带你学 点此查看详情

yingyonghaohuishi

从周一Allen“突然”登场化解公关危机和为应用号的推广省下一笔营销预算之后,普天盖地的自媒体在谈应用号,刷屏朋友圈。其实吧,应用号没什么新奇的,也说不上干翻应用商店之类的,只是如Allen所说“微信一个小小的举动都会被无限放大”。今天Jinkey就来科普一下所谓“应用号”

(也说不上科普,半年前去微信面试的时候针对服务号的不足,提出来“微信应用商店”的概念,估计面试官也没注意orz,今天拿出来说说。本文只是科普,并非官方发布的最终产品形态,我并不知道最终会以一种怎样优雅的方式呈现,微信总能给人惊喜…orz):

想知道应用号是啥东西可以下载这个demo有个大概印象,这是我一直在用的一套hybird app的开发框架。这个demo展示了网页应用通过javascript(网页的脚本语言)作为中介可以调用的原生系统能力的效果,微信自家的JS-SDK和这套框架及其相似,微信的JS-SDK甚至还没有这套框架提供的能力多。

1231231243

什么是hybird APP?

通俗的来说就是,在通过各种应用商店安装的APP( Native APP 原生应用)中某个页面添加一个WebView(浏览器组件,跟你们用来看岛国教育片的那种差不多的),开发者在原生APP代码里面挖一个洞(用来响应网页传给原生APP的指令和发送原生APP给网页的指令的接口)。结构如下图所示(iOS):

523453425

由一个系统提供的控件WKWebView(相当于你们平常用的浏览器)去加载一个网页。以iOS为例(很抱歉我已经放弃安卓了,本文主要以iOS为例子),通过evaluateJavaScript的方法在网页中执行js代码(网页执行动作的一种编程语言或者你可以理解为一种英语方言…你喜欢咯)。通过runJavaScriptAlertPanelWithMessage等方法(这里不展开说,开发的东西可以另外写好多文章了)可以响应网页中执行到的js代码,从而实现了网页调用手机系统原生接口的能力。概括成下图:

23435235234

有人可能会问:全部原生就好了,或者全部都是网页就好了,干嘛要调(diao)来调(diao)去?

下面就说一下

为什么要用hybrid APP?

(…我没跑题,微信应用号和微信本身就是一个hybrid APP)

当自媒体出现的时候,大家都说会干翻传统媒体,而现在传统媒体只是被淘汰掉劣质的,好的依然好好的,搞自媒体搞得好的,大部分也还是传统媒体有影响力的人;当网络视频出现的时候,大家都会说干翻电视台,而现在电视台依然好好的,还多了微信摇电视微博互动春晚红包等新奇玩法;当电商火热的时候,大部分的人都说电商会干翻线下商场,而现在大街上依然开着各种零售店,依旧很多人喜欢逛街。当各种理财宝宝出现的时候,大家都会说互联网理财干翻银行,而现在银行依旧垄断着资金流。人们似乎有一种新鲜狂热症,觉得新事物能够完全颠覆旧事物,而新事物最终会和旧事物融合,得到升华(比如“社会主义也能搞市场经济”哈哈)。

还记得2014年10月29日HTML5正式发布吗?铺天盖地的文章说web app将会干掉Native APP,可到了2016,你还到Native APP退出大众视野了吗?没有,而且两者的混合版Hybrid APP逐渐成了开发者的喜好。

hybrid APP的好处是:

1、自己搭一个原生应用的壳,能够定制和控制更多能力而不受限于浏览器(比如微信浏览器就是不让你下载), 所以大家会经常见到各种提示打开网页和分享的蒙层。

3425476546245

2、原生的壳包裹了网页应用便于升级迭代,不受限于应用商店繁琐的审核流程和冗长的时间(比如Appstore的审核)

3、网页应用有利于减少开发资源的投入。不像原生应用那样:每一个小改动都需要iOS工程师和安卓工程师改一遍。

4、快速恢复。当原生全量发布之后出现问题可能需要迭代新版本才能修复,而网页应用只需要在自己服务器上修改即可。

5、添加快捷方式到桌面即像一个原生APP获得系统一级入口(安卓和iOS都可以实现,只是目前微信在ios上不提供)

543546456456

6、有需要的时候再加载,节省手机空间,避免用户手机空间不足而放弃尝试你的应用。(你不能因为家里太窄而放弃掉一个想跟你xxoo的异性,你也没必要为了跟ta xxoo而马上买一间大房子,这时候你可以出去酒店开个房,用完就退。)

254523452345

而寄生于微信的hybrid APP(或许可以直接叫应用号)的好处又有所不同,因为他必须通过微信这个管道才能间接地获取手机系统原生的能力(重力感应、GPS定位、震动、通知等等)

243243543535

所以

微信应用的好处是:

1、通过OAuth2.0(一种授权登录的方式)可以获取用户头像昵称,降低繁琐的注册流程。

43253454

2、减少用户流失。

点一下关注即和你的应用进入高潮,无需等待下载原生应用漫长的前戏。

re34egsdg

3、降低开发成本。

可以调用微信提供的JSSDK,便捷地获取拍照、定位、弹窗提示、改变右上角菜单等能力,需要给自己的应用搭建一个原生的壳。对于个人开发者,前端语言只要会JavaScript就好了,WeUI框架都是现成的,可以懒得CSS样式都不用自己写。

2345234534

4、获得微信的安全保障。

原本你的应用还要考虑安卓、WP和iOS客户端的安全,现在只需要考虑网页本身的安全性就好了。

但是既然多了微信这个“电灯泡”,肯定也有它的劣势:

微信应用的坏处是:

1、你的业务跟某鹅有冲突,有可能就“由于网页被过多用户举报,暂时无法打开”…然后就没有然后了…

qretrdgsdg

2、获取系统原生能力受限于微信是否给你提供接口,比如现在JSSDK并不支持视频、室内定位、系统级通知、振动、获取加速度、获取手机系统信息、获取通讯录等等。又比如你要在你的应用加个吸底的输入框,但是微信没接口让你获取弹出键盘的高度,一点输入框键盘就把它遮住了,用户体验极其糟糕;

3、不能直接从微信执行下载、不能保存文件到手机本地等

4、一些禁止复制和禁止截图的保护内容,在微信里面都可以被复制,不能使用一些私有的加密逻辑。

5、有可能需要工商营业执照审核啥的,对于个人开发者不利。

gdsgfsdafwe

6、每次使用的提示授权,不像原生只要授权一次以后都可以用。(当然微信也可以提供一次授权和授权管理的功能,不过现在是没有的)

12312432435

7、投放广告受限制,微信可能觉得那是营销把你封掉。

8、不能缓存大容量文件,如音乐视频等。

9、诱导用户将该应用号添加到桌面成本高,且如果微信不提供接口或者有限制,那可能没办法放置在桌面了。这时候,桌面相当于一级入口,点开微信属于二级入口,点开微信应用号聚合页属于三级入口,点开你的应用使用某个功能相当于第四级入口,基于漏斗模型,用户流失会相当严重。

24353412341

应用号会怎么做?(推断)

1、微信搜索入口,类似于spotlight,甚至直接提供spotlight系统级搜索,直达应用号

234124234

2、基于服务号获得通知推送能力,简介触达到系统通知中心

4324345345

3、聚合页入口,类似于钱包(根据穷尽不重复原则,应该不会直接用钱包来做,并破坏用户认知)

253534546456

4、列表页

2zxzv

5、应用直接打开H5,类似于京东购物入口或者是基于聊天界面来做,底部按钮满足tab的职能

sfafds342424

6、通过JSSDK让应用号获得控制系统原生接口的能力,但受限于微信开放的接口。微信也不能随便开放,开得越多,漏洞越多。

bnghfg

7、工作流。比如说拍照、美化、发微博,希望需要打开两到三个APP才能完成。而微信可能提供接口,当拍照完的回调函数中调起美图网页版,编辑完图片的回调函数中调起微博并传过去美化后的图片,整个过程一气呵成。用过Workflow的人应该很清楚了,下图就是一个自动识别来电号码的工作流:

242354343534

和应用号类似的有什么?

UC应用中心、云集轻应用等。

UC应用中心我还是经常用的,但是UC轻应用无非就是打开了个网页,能调用原生能力有限,有些操作还是比较卡。而且这些轻应用和UC耦合度很低,把网址复制到其他地方就能用了。而像微信京东购物入口,腾讯充值等基于微信的hybrid app有些操作是需要检查微信登录状态,获取openID,进行oauth授权,利用微信关系链进行更多的互动和传播。

下面两张图就是UC应用中心截图:

123435543

qewrwer1

对于云集,他是一款IDG创业大赛个人开发者开发的应用,从资金实力和知名度当然比不上UC和微信,只是他当初提出这个轻应用的概念,UC和百度好像还没有这玩意。

适合谁去用?

应用号适合什么应用接入?      用Allen的一句话概括就是“用完即走”的应用,比如纯电商类买完就走,课程表工具查完就走,新闻客户端看完就走等等。这些应用有如下特点:

1)功能单一的

比如MacID,用iPhone指纹解锁mac电脑,功能单一,完全可以做出微信内嵌的应用(假如微信提供蓝牙接口)

2)使用频率低

比如滴滴打车这种,纯粹是一个打车的工具,打完就可以关掉了,正常上下班的话一天也就两次使用,完全没必要装个app。

3)使用时间短

还是以滴滴出行为例子,叫车5分钟内打开,下车5分钟内打开支付,使用时间极短,不需要长时间占用手机空间。

4)现象级应用

还记得风靡一时的脸萌吗?我就编辑个头像,从此就跟这个app就没有关系了,是比较适合用微信应用的形式的。围住神经猫这个小游戏也是作为一个网页应用在微信内疯狂传播的,假如要下载,可能就没那么流行了。

当然…大部分APP的开发者都不希望自己的应用成为“现象级”,昙花一现的应用。

应用号不适合什么应用接入?

1)必须直接获得手机底层能力的

比如一键root的工具、360手机卫士等,因为微信不会开放接口给你破坏系统的接口,安全风险太大。要开发接口也最多给到腾讯手机管家和TOS使用。

2)应用商店

豌豆荚等,人家有应用宝不跟你玩了,下载接口都不给你,你还去凑什么热闹。不过像最美应用等推荐类的还是有戏的。

3)社交APP

最重要的关系链人家都不给你接口,你还在人家这里玩个球啊?社交app使用时间长、频率高,特别是聊天、表情等互动非常不适合在网页端进行,会非常卡,因此更适合自己做一个app。

而论坛就很适合,论坛就有非即时、互动轻(点赞、评论)等特点,非常适合在H5网页中使用。

4)需要大量缓存的应用

比如网易云音乐和侧重离线观看的视频app并不适合,现在微信就因为体积越来越庞大而被吐槽,所以应该不会开放本地储存接口给到其他应用的。而且允许其他应用文件进入微信app沙盒(不懂的可以搜索一下“ios沙盒机制”),有可能对微信造成安全风险。

5)图片、摄影类

就微信目前提供的接口来看,图片美化和视频美化应用虽然也属于工具类app,但是由于如果做成微信应用,需要频繁的进行图片和视频的上传和下载操作,并且在手机网页进行拖拽缩放旋转等操作体验极其不好。所以并不适合接入微信应用号。

6)企业应用

想用就玩企业号去,没营业执照的可以百度一下“企微云平台”注册体验一下。

总结

微信应用号其实就是只是一种Hybird APP,应用号只是一个管道,一个入口,微信再厉害也永远不是一个OS(微信能超越os的能力?那腾讯还做TOS干啥?),所以做好你自己的服务,把微信作为一个入口,而不是你的全部。

dsfgdfsger

 

作者:Jinkey,微信公众号:jinkey-love,90后自媒体联盟成员,一个刚出道的产品菜鸟。分享产品道路成长的点滴,读书笔记,产品策划和运营干货,技术开发、数据分析等产品经理的进阶技能。愿你与我一同成长。

本文为作者@Jinkey原创发布于人人都是产品经理,未经许可,禁止转载。

PM小技巧——流程图&产品原型

没人带,自学慢,不在BAT怎么学产品?人人都是产品经理联合200+BAT资深产品经理带你学 点此查看详情

在规划产品功能时,产品经理需要和设计师一起将原本比较抽象的产品需求变得更加具体。一般来说,将抽象的产品需求具体化也可以分解为四个环节:确定产品需求范围、制作流程图、制作产品原型、设计产品视觉DEMO。

liuchengrtu

关于分析与管理产品需求的文章之前已经写过很多了,而产品DEMO是由专业的UI设计师进行设计展现。简单地谈一下流程图与产品原型,二者不仅是产品功能需求的具体体现,也是后面进行DEMO设计的基础。

流程图=业务场景+逻辑思维+流程可视化

制作流程图的好处有很多,主要是体现在两个方面:

一是帮助产品经理梳理、完善用户操作流程。

基于流程图,产品经理通过模拟不同用户在不同场景下对流程中每个步骤的具体操作,便可以很方便地对整个流程进行评估,确定流程是否可以保障所有用户都能很好地完成整个任务。

因此,在进行制作流程图之前,我们是需要熟悉相关的业务场景,对用户整个流程的操作了然于胸,这要求产品经理在熟悉业务场景的基础上具备缜密的逻辑思维。

二是有效降低团队成员间的沟通成本。

在实际工作中,产品经理需要向很多人描述产品需求,借助可视化的流程图,沟通的效率会提高很多,毕竟一份步骤清晰的流程图要比一大段文字直观易懂得多。

个人认为,逻辑思维与人际沟通是产品经理最基本也是最重要的素质。之后就是将具体的流程进行可视化展示,这个就比较简单了。

之前去美团面试后端产品时,由于工作岗位涉及到逻辑、流程,面试时要求根据自己入学时的场景,画一张新生入学流程图。恰巧当时还在研究生会,所以对相关场景还是比较熟悉的,画出来的结果面试官也比较满意。下面是微博的后台管理系统,用Visio画的,由于时间比较紧张,下一层级模块的操作逻辑就省略了。

QQ图片20160111165900

制作流程图的工具没有什么特殊的要求,可以用笔直接画在纸上,可以用Photoshop德国画图工具,也可以用专业的流程图制作工具,比如Visio。无论用什么工具,制作出来的流程图都应该符合一些基本要求,比如直观易懂、布局清晰、逻辑完整、站在用户视角考虑等。

流程图

产品原型=用户需求+产品功能优先级+原型制作

在将抽象的产品需求具体化的四个环节中,原型制作是很关键的一个环节,因为它要将大量存在产品经理脑海中的信息转化为可视化图形。

产品原型是用于表达产品功能和内容的示意图。一份完整的产品原型要能够清楚的交代:产品包括哪些功能、内容;产品分为几个页面,功能、内容在界面中如何布局;用户流程的具体交易细节如何设计等。

概括来说,产品原型设计要涵盖三个要素:元素、界面、交互。

对于产品经理来说,通过用户调研、竞品分析确定产品功能需求范围后,制作产品原型有很重要的意义。

有助于完善、优化产品需求方案

在此之前,产品需求还停留在抽象、模糊的概念阶段,属于“空中楼阁”,而制作的原型已经很接近最终的成型产品了,产品经理可以模拟不同的用户场景测试规划好的产品功能,也可以分别以用户、交互设计师、开发工程师的视角审视原型,进而不断地修改产品原型,更好地完善、优化产品需求方案。

方便对产品需求进行评估

一旦产品需求进入开发阶段,再进行需求变更需要付出巨大的代价。相对于产品需求文档,使用产品原型进行需求评估更具有可操作性。产品需求的评估包括产品价值、产品可用性、产品技术可行性三方面的评估。

产品需求在进入实际设计和开发之前,要进行详细的评估,确保产品功能符合用户的需求,对于用户来说是可用的,并且能够通过技术手段实现。

有效降低与团队成员的沟通成本

产品原型对产品经理的重要性还体现在它能够有效降低与团队成员间的沟通成本。在实际工作中,产品经理需要向多人描述产品需求,而产品原型最大的优势是能够将产品需求以图像化的方式进行展现,使产品需求一目了然,大幅降低沟通成本。

如何制作产品原型?

毫无疑问,Axure是绝大多数产品经理的首选。曾经也像很多产品新人一样,买书籍、看视频,满脑子想的是如何把原型设计更酷炫。直到有次参加指导我的产品经理(她已经工作了6年)PRD的需求评审,我问她那些原型是用什么工具制作的,她告诉我是绘画板,就是电脑自带的那个绘图工具。后来我就顿悟了,工具是为了解决问题的,不能为了工具而学工具,那样就成了工具的奴隶。

下面这个数据中心是客户端原型的一部分(这个不是我画的),已顺利通过测试并刚刚上线,希望大家多多支持。

yuanxing2

在制作产品原型时,有一些要点是需要注意的:

产品功能和内容等元素要完整且细节明确

产品原型是用于表达产品功能和内容的示意图,因此,产品原型首先要保证产品功能和内容是完整的,要考虑周全,不要有所遗漏。比如,注册登录界面,在没有输入的情况下,是有文字提示,还是默认灰色,这些都是需要考虑的。

交互设计要同时体现产品价值和产品可用性

界面设计主要是确定产品分为几个界面,功能和内容在界面中如何布局;交互设计主要是确定产品与用户如何进行交互。一方面,对各元素的交互设计要能够使产品价值最大化;另一方面,对各元素的交互设计要能够使产品更易用。

产品原型不应该有过多的视觉设计元素

这里主要是要将产品原型和视觉设计区别开来,制作原型的目的是为了更加形象地表达产品需求,以方便产品需求的评估、确定工作。如果加入过多的视觉设计因素,那么就会将注意力转移到视觉方案上了。

当然,作为产品新人在求职时完全是可以制作一个Axure简历的,开始时我也做过,但是现在回头看看,感觉作品真的很low,就是简单的抽屉式导航,不过当时感觉还是很有意思的。

捕获

 

作者:尹剑利,微信公众号@尹剑利(yinjianli88)。研究生在读,新浪微博数据产品经理实习生,有过多家知名上市公司的实习经历。热爱人文历史,痴迷互联网。希望遇到志同道合的朋友多多交流。

本文由 @尹剑利 原创发布于人人都是产品经理 ,未经许可,禁止转载。