當一個程式第一次啟動的時候,Android會啟動一個LINUX進程和一個主線程。預設的情況下,所有該程式的組件都將在該進程和線程中運行。 同時,Android會為每個應用程式分配一個單獨的LINUX用戶。Android會儘量保留一個正在運行進程,只在記憶體資源出現不足時,Android會嘗試停止一些進 ...
當一個程式第一次啟動的時候,Android會啟動一個LINUX進程和一個主線程。預設的情況下,所有該程式的組件都將在該進程和線程中運行。 同時,Android會為每個應用程式分配一個單獨的LINUX用戶。Android會儘量保留一個正在運行進程,只在記憶體資源出現不足時,Android會嘗試停止一些進程從而釋放足夠的資源給其他新的進程使用, 也能保證用戶正在訪問的當前進程有足夠的資源去及時地響應用戶的事件。線程是進程的有機組成部分,是CPU調度的基礎。一般情況下,都有主線程和其他線程之分,只有主線程才可以刷新UI。應用程式啟動後,將創建ActivityThread 主線程。
不同包名的組件可以一定的方式運行在同一個進程中。
一個Activity啟動後,至少會有3個線程。一個主線程和2個binder線程。
1.安卓線程間通信的方式有以下幾種1)共用變數(記憶體)
2)管道
3)handle機制
runOnUiThread(Runnable)
view.post(Runnable)
android 進程內的消息驅動機制---Handler,MessageQueue,Runnable,Looper
Looper和Message的處理機制:首先在主線程中創建了一個handler對象,目的是為了處理從子線程發送過來的消息,然後當子線程有發送消息的需求時會使用Message對象,消息首先會被存儲在Message queue消息隊列中,主線程還有一個Looper消息輪詢器,會迴圈遍歷消息隊列中的消息,當發現消息的時候會發送消息給handler處理(更新ui等操作),handler調用handleMessage處理完後將Message置為null以便回收.
2進程間的通信
進程間的通信:
bind機制(IPC->AIDL)
linux級共用記憶體
boradcast
Activity之間可以通過intent來傳遞數據
3.安卓結束進程幾種方式
1)使用ActivityManager中的restartPackage(String packname)方法,這裡清單文件裡面要配置許可權
2)android.os.process.killProcess(int pid)只能終止本程式的進程
3)System.exit()
4)在android2.2版本之後則不能再使用restartPackage()方法,而應該使用killBackgroundProcesses()方法,同時應該配置許可權
5)利用反射調用forceStopPackage來結束Method forceStopPackage = am.getClass().getDeclaredMethod("forceStopPackage", String.class);
forceStopPackage.setAccessible(true);
forceStopPackage.invoke(am, yourpkgname);
6)使用Linux指令kill -9
7)退出到主屏幕
public boolean onKeyDown(int keyCode, KeyEvent event) { // event.getRepeatCount():按下返回鍵,同時沒有重覆 if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { Intent home = new Intent(Intent.ACTION_MAIN); home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); home.addCategory(Intent.CATEGORY_HOME); startActivity(home); } return super.onKeyDown(keyCode, event); }