Android应用程序启动流程总结

Android应用程序启动流程总结,第1张

AMS主要功能:

AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作。还负责启动或杀死应用程序的进程。

WMS主要功能:

为所有窗口分配Surface。

管理Surface的显示顺序、尺寸、位置。

管理窗口动画。

输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息。

PWS主要功能:

PMS 用来管理跟踪所有应用APK,包括安装,卸载,解析,控制权限等。

SystemServer也是一个进程,包括AMS、PMS、WMS等等。

zygote意为“受精卵“。Android是基于Linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,zygote进程也不例外。

App进程是用户点击桌面icon时,通过Launcher进程请求SystemServer,再调用Zygote孵化的。

①点击启动一个App,Launcher进程采用Binder IPC向ActivityManagerService发起startActivity请求;

②ActivityManagerService接收到请求后,向zygote进程发送创建进程的请求;

③Zygote进程fork出新的子进程,即App进程;

④App进程通过Binder IPC向sytem_server进程发起绑定Application请求;

⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;

⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;

⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。

⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

备注:

Launcher,PMS,Zygote,App进程是三个独立的进程,相互通信就需要使用进程间通信机制。与Zygote通信是使用的socket通信,Launcher,PMS,App进程间使用的是Binder机制。

安装自启动:

要做这个功能有一个前提,那就是用户的机器上已经装过相应应用,也就是说只有升级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>

是指程序运行最先启动的activity。

在每个activity完成后,要想让它成功运行,必须在配置文件AndroidManifest.xml中进行注册。最先启动的activity在AndroidManifest.xml中注册时是有其特殊性的即必须包含<intent-filter>

               

<action

android:name="android.intent.action.MAIN"

/>

<intent-filter>

所以最直接的方法就是打开配置文件AndroidManifest.xml

在配置文件中直接搜索main,其对应的activity就是最先启动的activity

如下图所示:


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8164530.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存