日拱一卒(七)

Android难点:

1.Activity的启动模式:standard,singletop,singleinstance,singletask什么区别?

standard:启动的Acitivity在栈中有多个实例

singletop:启动的Activity如果处于栈顶,再次启动Activity则不会创建新的实例

singletask:如果栈中没有实例,则创建一个新的实例,否则将该实例上的Activity统统出栈,后使用该实例。

singleInstance:创建单独的一个栈存放该Activity。例子:ActA -->ActB-->ActC,ActB为singletask模式,其他为standard,按返回,则调用的顺序:ActC----->ActA-->ActB.原因是ActA与ActC处于同一个栈,ActC处于栈顶,ActB处于另一个栈,先清空ActC所处的栈在跳到ActB所处的栈。

2.ListView的Adapter的ViewHolder有什么作用?怎么使用?

记录listview中view的引用,减少findViewById的耗时操作;

使用:Adapter的getView方法中,如果convertView没生成,生成convertView的时候用ViewHolder记录convetView的引用,并将ViewHolder通过convertView的setTag的方法保存。否则通过convertView的getTag方法得到ViewHolder

3.Fragment(碎片)的add和remove什么区别?addToBackStack有什么用?如何同一个activity在平板和手机加载不同的布局?

add:新增一个Fragment到现在的ViewGroup中

remove:将ViewGroup现有的Fragment替换成现有的Fragemnt

addToBackStack:将Fragment加入历史栈,按back键时返回栈中的Fragment。

4.Activity与Activity怎么通信?Activity与Service怎么通信?

activity与activity通信:startActivityResult或者更灵活的BroadCast

activity与service通信:BroadCast或者BindSerivice

5.什么是有序广播,与标准广播有什么区别?广播接收器的静态注册和动态注册什么区别?

有序广播:同步执行的广播,同一个时刻只有一个广播接收器接收到这条广播。通过有序广播设置接受广播的先后顺序,在传递过程中通过abortBroadcast终止往下传递

标准广播:异步执行的广播,广播接收器几乎在同一时刻接收到这条广播。

 动态注册:在代码注册;应用启动时再能接受广播,需要手动反注册。

静态注册:在AndroidManifest注册;程序没启动也能接受广播

6.什么是本地广播?

只能在应用本身内部传递的广播,可以解决系统全局广播的安全性问题。

如何使用?

public class MainActivity extends Activity {
	
	private IntentFilter intentFilter;

	private LocalReceiver localReceiver;

	<span style="color:#ff0000;">private LocalBroadcastManager localBroadcastManager;</span>

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		<span style="color:#ff0000;">localBroadcastManager = LocalBroadcastManager.getInstance(this); // 获取实例</span>
		Button button = (Button) findViewById(R.id.button);
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				<span style="color:#ff0000;">Intent intent = new Intent("com.example.broadcasttest. LOCAL_BROADCAST");
				localBroadcastManager.sendBroadcast(intent); // 发送本地广播</span>
			}
		});
		intentFilter = new IntentFilter();
		intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
		localReceiver = new LocalReceiver();
		localBroadcastManager.registerReceiver(localReceiver, intentFilter); // 注册本地广播监听器
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		localBroadcastManager.unregisterReceiver(localReceiver);
	}

	class LocalReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
		}

	}

}
注意:

(1)本地广播是无法通过静态注册的方式来接收的(2)比系统全局广播更加高效

(2)本地广播的注册反注册,接收都要一致即:都需要带上LocalBroadcastManager.getInstance(context).;如果发送的没带,则认为是系统广播,相应注册的广播接收器是收不到消息的。系统广播亦同。

最佳应用实例:在被迫下线的时候弹出dialog通知用户


7.MeasureSpec中的三个模式EXACTLY,AT_MOST,UNSPECIFIED什么区别?


8.android.intent.category.DEFAULT与android.intent.category.LAUNCHER什么区别?


9.View和ViewGroup的事件处理机制


10.Android中的缓存机制与实现


11.加载移动设备的图片时,如何防止图片加载引起的卡顿,内存溢出?


12.请说说SoftReference,WeakReference,PhantomReference各是什么?有何用处?



你可能感兴趣的:(android)