android啟動應用程序
『壹』 如何啟動一個被home的android應用程序
Android系統的Home應用程序Launcher是由ActivityManagerService啟動的,而ActivityManagerService和PackageManagerService一樣,都是在開機時由SystemServer組件啟動的,SystemServer組件首先是啟動ePackageManagerServic,由它來負責安裝系統的應用程序,具體可以參考前面一篇文章Android應用程序安裝過程源代碼分析,系統中的應用程序安裝好了以後,SystemServer組件接下來就要通過ActivityManagerService來啟動Home應用程序Launcher了,Launcher在啟動的時候便會通過PackageManagerServic把系統中已經安裝好的應用程序以快捷圖標的形式展示在桌面上,這樣用戶就可以使用這些應用程序了,整個過程如下圖所示:
下面詳細分析每一個步驟。
Step 1. SystemServer.main
這個函數定義在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具體可以參考前面一篇文章Android應用程序安裝過程源代碼分析的Step 1。
Step 2.SystemServer.init1
這個函數是一個JNI方法,實現在frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中,具體可以參考前面一篇文章Android應用程序安裝過程源代碼分析的Step 2。
Step 3.libsystem_server.system_init
函數system_init實現在libsystem_server庫中,源代碼位於frameworks/base/cmds/system_server/library/system_init.cpp文件中,具體可以參考前面一篇文章Android應用程序安裝過程源代碼分析的Step 3。
Step 4.AndroidRuntime.callStatic
這個函數定義在frameworks/base/core/jni/AndroidRuntime.cpp文件中,具體可以參考前面一篇文章Android應用程序安裝過程源代碼分析的Step 4。
Step 5.SystemServer.init2
這個函數定義在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具體可以參考前面一篇文章Android應用程序安裝過程源代碼分析的Step 5。
Step 6.ServerThread.run
這個函數定義在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具體可以參考前面一篇文章Android應用程序安裝過程源代碼分析的Step 6。
Step 7. ActivityManagerService.main
這個函數定義在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:
[java]view plain
implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
......
publicstaticfinalContextmain(intfactoryTest){
AThreadthr=newAThread();
thr.start();
synchronized(thr){
while(thr.mService==null){
try{
thr.wait();
}catch(InterruptedExceptione){
}
}
}
ActivityManagerServicem=thr.mService;
mSelf=m;
ActivityThreadat=ActivityThread.systemMain();
mSystemThread=at;
Contextcontext=at.getSystemContext();
m.mContext=context;
m.mFactoryTest=factoryTest;
m.mMainStack=newActivityStack(m,context,true);
m.mBatteryStatsService.publish(context);
m.mUsageStatsService.publish(context);
synchronized(thr){
thr.mReady=true;
thr.notifyAll();
}
m.startRunning(null,null,null,null);
returncontext;
}
......
}
這個函數首先通過AThread線程對象來內部創建了一個ActivityManagerService實例,然後將這個實例保存其成員變數mService中,接著又把這個ActivityManagerService實例保存在ActivityManagerService類的靜態成員變數mSelf中,最後初始化其它成員變數,就結束了。
Step 8.PackageManagerService.main
這個函數定義在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中,具體可以參考前面一篇文章Android應用程序安裝過程源代碼分析的Step 7。執行完這一步之後,系統中的應用程序的所有信息都保存在PackageManagerService中了,後面Home應用程序Launcher啟動起來後,就會把PackageManagerService中的應用程序信息取出來,然後以快捷圖標的形式展示在桌面上,後面我們將會看到這個過程。
『貳』 Android12 應用啟動流程分析
本文詳細解析了Android應用的啟動流程,從應用端到服務端,經過多層系統服務和RPC調用,最終啟動目標Activity。整體流程始於Activity的調用,如`Context.startActivity`,經過Instrumentation的執行,再到ActivityTaskManager的管理,以及ActivityStarter的啟動。關鍵在於識別跨進程的RPC調用和多態調用。
Activity的啟動通常通過`Activity.startActivity`等方法實現,這些方法最終調用`Instrumentation.execStartActivity`進行具體實現。Instrumentation是系統提供的代碼追蹤入口,允許監控系統與應用之間的交互。通過覆寫`Instrumentation.execStartActivity`方法,可以實現對Activity啟動事件的觀察與控制。
在應用啟動過程中,ActivityTaskManager起到了核心作用,負責管理所有活動、窗口以及任務棧。啟動新Activity的過程通過ActivityTaskManager的`startActivity`方法實現,涉及到一系列的判斷與操作,包括決定是否新建任務、啟動新進程等。
啟動新進程的關鍵在於ActivityTaskManagerService與ActivityManagerService的協作。ActivityTaskManagerService負責啟動進程,並通過`startProcessAsync`非同步發送消息至ActivityManagerService。ActivityManagerService進一步處理進程啟動,包括通過ZygoteServer啟動子進程,並返回進程ID。ZygoteServer接收消息後,通過UNIX socket與AMS進行通信,完成新進程的創建。
新進程啟動後,其入口是ActivityThread的main方法,執行應用程序的初始化與Activity的啟動。此過程涉及了RPC通信,確保系統服務與應用進程之間能夠協調啟動流程。ActivityThread負責管理進程內的生命周期事件,確保在正確的時間執行應用程序代碼。
在啟動Activity時,流程會經過ActivityThread的處理,最終調用Activity的生命周期方法如`onCreate`。這一過程展示了Android系統在啟動應用時的精細控制,包括進程管理、RPC調用、許可權分離等多方面的設計與優化。通過理解這些核心組件與流程,開發者能夠更深入地掌握Android應用的啟動機制,為構建高效穩定的應用奠定基礎。
『叄』 如何在Android中啟動JAVA程序
在Android中啟動JAVA程序其實有很多種方式,現總結如下
一、在Android應用程序中發送Intent啟動Android應用程序
這個方式最簡單,最常用。在此不在累述。關於Intent的更多內容請閱讀《Intent技術簡介》
二、在shell控制台通過am命令發送Intent來啟動Android應用程序
在Android的shell控制台通過am命令發送Intent來啟動Android應用程序
關於此的詳細內容請參考《Android命令am詳解》
三、在shell控制台直接通過davlikvm命令啟動一個JAVA程序。
該方式有個天生的缺點,即在其中,很多Android的JNI無法調用。因為Android的很多JNI其實是需要手動注冊的。
關於請參考《基本Dalvik VM調用》
四、在shell控制台直接通過運行app_process程序啟動一個JAVA程序
在app_process程序中,他會對Android的JNI進行手動注冊的,能很好的使用Android的API,因此通過運行app_process程序啟動一個JAVA程序,是一個比較完美的方式。app_process程序是一個C程序,它的源碼位於frameworks\base\cmds\app_process。
關於它的使用請參考《Android命令am詳解》以及shell腳本frameworks\base\cmds\am\am和frameworks\base\cmds\pm\pm
am腳本文件如下:
# Script to start "am" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/am.jarexec app_process $base/bin com.android.commands.am.Am "$@"pm腳本文件如下:
# Script to start "pm" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/pm.jarexec app_process $base/bin com.android.commands.pm.Pm "$@"CLASSPATH指定了你的程序的位置,com.android.commands.pm.Pm則說明了程序的入口為com.android.commands.pm.Pm,即入口函數main()所在的類,"$@"就是傳遞給main()函數的參數,只是這里"$@"本身又是個shell傳入的參數而已
需要注意的是CLASSPATH中的文件必須是dalvik文件格式的,關於此的轉換請參考《基本Dalvik VM調用》當然CLASSPATH中的文件可以是apk文件,只是你的apk中至少應該有個擁有main()入口函數的類。
轉載
『肆』 android 怎麼自啟動應用
安裝自啟動:
要做這個功能有一個前提,那就是用戶的機器上已經裝過相應應用,也就是說只有升級APK的時候才可以這么干,因為要執行的功能需要程序的配合。
具體步驟如下:
首先要知道程序已經安裝完成,所以需要在程序中注冊一個廣播監聽(必須是靜態的,你懂的)apk安裝完成的action:"android.intent.action.PACKAGE_ADDED",在這個廣播的onReceive方法中監聽action,並通過intent.getDataString()方法判斷安裝程序的包名是否屬於自己的包名,如果是做下一步操作;
通過Intent顯式或者隱式的啟動你自己的程序。
建議:
最好不要這樣干,你要考慮一下用戶的感受,特別是那種自動安裝不需要點確認的時候,正在玩游戲、看視頻、看小說、用微信你自動打開一個應用
開機自啟動
android實現開機自啟動可能是移動操作系統中最簡單的了,只需要監聽一個開機啟動的Broadcast(廣播)即可。首先寫一個Receiver(即廣播監聽器),繼承BroadcastReceiver。
如下所示:
public class BootReceiver extends BroadcastReceiver {
private PendingIntent mAlarmSender;
@Override
public void onReceive(Context context, Intent intent) {
// 在這里干你想乾的事(啟動一個Service,Activity等),本例是啟動一個定時調度程序,每30分鍾啟動一個Service去更新數據
mAlarmSender = PendingIntent.getService(context, 0, new Intent(context,
RefreshDataService.class), 0);
long firstTime = SystemClock.elapsedRealtime();
AlarmManager am = (AlarmManager) context
.getSystemService(Activity.ALARM_SERVICE);
am.cancel(mAlarmSender);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
30 * 60 * 1000, mAlarmSender);
}
}
接下來,只需要在應用程序配置文件AndroidManifest.xml中注冊這個Receiver來監聽系統啟動事件即可
如下所示:
<receiver android:name=".service.BootReceiver">
<intent-filter>
<!-- 系統啟動完成後會調用-->
<action android:name="android.intent.action.BOOT_COMPLETED">
</action>
</intent-filter>
</receiver>