Android开机启动Activity或者Service方法---------------一直保持欲行
16lz
2021-01-26
今天我们主要来探讨android怎么让一个service开机自动启动功能的实现。Android手机在启动的过程中会触发一个Standard Broadcast Action,名字叫android.intent.action.BOOT_COMPLETED(记得只会触发一次呀),在这里我们可以通过构建一个广播接收者来接收这个这个action.下面我就来简单写以下实现的步骤: 第一步:首先创建一个广播接收者,重构其抽象方法 onReceive(Context context, Intent intent),在其中启动你想要启动的Service或app。 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class BootBroadcastReceiver extends BroadcastReceiver { //重写onReceive方法 @Override public void onReceive(Context context, Intent intent) { //后边的XXX.class就是要启动的服务 Intent service = new Intent(context,XXXclass); context.startService(service); Log.v("TAG", "开机自动服务自动启动....."); //启动应用,参数为需要自动启动的应用的包名 Intent intent = getPackageManager().getLaunchIntentForPackage(packageName); context.startActivity(intent ); } } 第二步:配置xml文件,在receiver接收这种添加intent-filter配置 <receiver android:name="BootBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </receiver> 第三步:添加权限 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- packagecom.billhoo.study;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- publicclassBootTestActivityextendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- }
- packagecom.billhoo.study;
- importandroid.content.BroadcastReceiver;
- importandroid.content.Context;
- importandroid.content.Intent;
- publicclassBootCompletedReceiverextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
- {
- IntentnewIntent=newIntent(context,BootTestActivity.class);
- newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//注意,必须添加这个标记,否则启动会失败
- context.startActivity(newIntent);
- }
- }
- }
- <receiverandroid:name=".BootCompletedReceiver">
- <intent-filter>
- <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
- </intent-filter>
- </receiver>
- <!--permissions-->
- <uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
另一篇: android一直保持运行:
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.billhoo.study"android:versionCode="1"
- android:versionName="1.0">
- <uses-sdkandroid:minSdkVersion="4"/>
- <!--permissions-->
- <uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
- <!--activities-->
- <activityandroid:name=".BootTestActivity"android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <!--receivers-->
- <receiverandroid:name=".BootCompletedReceiver">
- <intent-filter>
- <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
- </intent-filter>
- </receiver>
- </application>
- </manifest>
Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务。而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持,就会被其杀掉。
如何保持Service的运行状态是现在要说明的,核心就是利用ANDROID的系统广播,这一不会被其他软件影响的常驻程序触发自己的程序检查Service的运行状态,如果被杀掉,就再起来。
我利用的系统广播是Intent.ACTION_TIME_TICK,这个广播每分钟发送一次,我们可以每分钟检查一次Service的运行状态,如果已经被结束了,就重新启动Service。
下边就是具体的代码和注意事项了:
1、 Intent.ACTION_TIME_TICK的使用
我们知道广播的注册有静态注册和动态注册,但此系统广播只能通过动态注册的方式使用。即你不能通过在manifest.xml里注册的方式接收到这个广播,只能在代码里通过registerReceiver()方法注册。
在ThisApp extends Application 里注册广播:
- IntentFilterfilter=newIntentFilter(Intent.ACTION_TIME_TICK);
- MyBroadcastReceiverreceiver=newMyBroadcastReceiver();
- registerReceiver(receiver,filter);
在广播接收器MyBroadcastReceiver extends BroadcastReceiver的onReceive里
- if(intent.getAction().equals(Intent.ACTION_TIME_TICK)){
- //检查Service状态
- }
2、Service的检查与启动
- booleanisServiceRunning=false;
- ActivityManagermanager=(ActivityManager)ThisApp.getContext().getSystemService(Context.ACTIVITY_SERVICE);
- for(RunningServiceInfoservice:manager.getRunningServices(Integer.MAX_VALUE)){
- if("so.xxxx.WidgetUpdateService".equals(service.service.getClassName()))
- //Service的类名
- {
- isServiceRunning=true;
- }
- }
- if(!isServiceRunning){
- Intenti=newIntent(context,WidgetUpdateService.class);
- context.startService(i);
- }
更多相关文章
- 【Parallax Animation】实现知乎 Android(安卓)客户端启动页视差
- Android(安卓)startService 启动自动解锁点亮屏幕
- Android之广播大全 Intent Action 事件
- android Notification 的使用!!!
- i.mx51开发板利用已有的镜像文件(SD卡启动)刷写Android
- android SystemUI 流程分析
- android之应用程序启动第三方应用
- 【3】Android新建Activity (Eclipse)
- 纯Java代码写登录注册页面