进程和线程Processes and Threads

1、默认同一个app的所有组件运行在同一个process中,<application>、<activity>、<service>中的process属性可以设置组件所属的process;默认使用<application>中的包名process,每个组件可以设置自己的process值,设置私有或者公共进程名。同一个userID和签名证书的app可共享process;
IPC:内部实现RPC,Android将c端方法调用转化为OS底层可理解的数据,传递给远程进程地址空间S端,s端重新组装数据,执行方法,将结果再逆向给c端。
2、进程重要性优先级--用户process按拥有的组件的运行状态来划分重要性:
	foreground process--用户交互需要的进程:activity在running/assumed状态;bound service的activity在running/assumed状态;startForeground()的service;正在执行onCreate()、onStart()、onDestroy()的service;正在执行onReceive()的BroadcastReceiver。
	visible process--用户可见,但没有foreground component的process:visible的activity;bound service的activity在visible状态。
	service process--执行了startService()但未销毁的started service。
	background process--stopped activity,按LRU队列杀死process。
	empty process--没有active组件的process,只是cache来提高下次启动速度。
3、线程
UI/main thread--单线程模式:派发widget、view的交互、绘制事件;组件的初始化;派发系统给个组件的事件;
	ANR:UI thread如果blocked超过5s,系统会给出ANR对话框。
单线程模式规则:
	不要block UI thread:创建worker thread。
	UI tookit的访问必须通过UI thread:不需要ui交互的简单调用可用activity.runOnUiThread(Runnable)、view.post(Runnable,long);复杂的交互用Handler(实现handleMessage)、AsyncTask;
AsyncTask:分离工作到worker thread、UI thread两部分。简化worker thread、handler的使用,适用于秒级的短操作。不错的总结:http://blog.csdn.net/hitlion2008/article/details/7983449
	worker thread:线程池;doInBackground();publishProgress()调用UI thread的onProgressUpdate();
	UI thread:onPreExecute(), onPostExecute(), onProgressUpdate() ;
线程安全方法:
	bound service:同一process的IBinder中方法在调用者thread中执行,从其它process调用IBinder时,onBind()在UI thread中执行,其它方法在IBinder同一process的系统维护的线程池中的thread中执行。
	content provider:query()、insert()在其process线程池的thread中执行,需实现thread-safe。
4、权限:
	签名证书:区分作者;
	
	userId:安装时每个包一个userID,每个userID有不同的文件权限;通过在不同包的<manifest>使用相同的sharedUserId、签名证书来共享userId,设置组件使用相同的process属性在同一个process中运行;getSharedPreferences()、openFileOutput()、openOrCreateDatabase()的数据都被赋予userId作为文件主,MODE_WORLD_READABLE标志可以赋予其它userId的user读写权限。
		<uses-permission>:apk包安装时申请权限;
	
	app自定义权限<permission>:name属性是唯一标识;label与description属性是显示给用户的描述;protectionLevel属性告诉系统怎么显示给用户;
	
	列出所有权限:adb shell pm list permissions -s

	在<activity>、<service>的组件声明中加入android:permission,调用该组件如startActivity()时需要有对应的permission,否则抛出SecurityException;<broadcast receiver>需与broadcast配合permission使用;<content provider>有read、write两种permission。
	检查权限:IPC检查权限checkCallingPermission()、 checkPermission()、PackageManager.checkPermission()。
	per-URI permission:<content provider>的grantUriPermissions属性设为“true”,可通过 Intent.FLAG_GRANT_READ_URI_PERMISSION在调用时动态赋予单个URI权限。
5、App Widgets:微型应用view,可嵌入host(如Home),由App Widget provider定期更新。
原文地址:https://www.cnblogs.com/toven/p/2641127.html