当前位置:首页 » 安卓系统 » 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:52:35 浏览:463
数据库样本 发布:2025-06-22 13:50:21 浏览:498
暴雪服务器ip 发布:2025-06-22 13:29:02 浏览:442
访问学者签证时间 发布:2025-06-22 13:24:49 浏览:705
怎么获取脚本包名 发布:2025-06-22 13:23:59 浏览:811
zq解压器 发布:2025-06-22 13:23:19 浏览:327
阿里云美国服务器vpn服务器 发布:2025-06-22 13:22:23 浏览:418
宏碁电脑配置需要换什么零件 发布:2025-06-22 13:11:07 浏览:956
c语言函数定义类型 发布:2025-06-22 13:09:40 浏览:602
数据库生序 发布:2025-06-22 13:09:32 浏览:670