當前位置:首頁 » 安卓系統 » android啟動應用程序

android啟動應用程序

發布時間: 2025-06-22 08:56:07

『壹』 如何啟動一個被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>

熱點內容
宏碁電腦配置需要換什麼零件 發布:2025-06-22 13:11:07 瀏覽:955
c語言函數定義類型 發布:2025-06-22 13:09:40 瀏覽:601
資料庫生序 發布:2025-06-22 13:09:32 瀏覽:669
簡化ftp的軟體 發布:2025-06-22 13:06:20 瀏覽:872
筆記本怎麼看無線密碼 發布:2025-06-22 13:05:48 瀏覽:319
如果伺服器過期該怎麼辦 發布:2025-06-22 12:50:49 瀏覽:167
地理和c語言 發布:2025-06-22 12:50:47 瀏覽:612
博途提示訪問的數據塊尚未被編譯 發布:2025-06-22 12:47:50 瀏覽:446
耶斯莫拉系列解壓 發布:2025-06-22 12:40:46 瀏覽:95
前端是如何與地圖伺服器交互的 發布:2025-06-22 12:15:11 瀏覽:361