您的位置:首页 > 移动开发

Android开机自启动App(附带源码)

2016-09-02 10:41 405 查看

开机启动概要

Android程序如果想要开机自启动,这里就会涉及到Android四大组件的内容Service、BoadcastReceiver。

什么是服务Service

当我们在开发App时,有时候会用到没用界面的程序交互时就会用到Service,比如说音乐播放器,我们在退出音乐播放器时,其实音乐还是会在后台程序中运行,此时播放器我们是看不见的。

服务生命周期:context.startService() ->onCreate()- >onStart()- >onStartCommand()->Service running ->context.stopService()  ->onDestroy() ->Service
stop

如果Service还没有运行,则android先调用onCreate()然后调用onStartCommand(),每次调用startService(Intent)的时候,都会调用执行onStartCommand();
如果Service已经运行,则只调用onStartCommand()。 

  我们要执行操作可在onStartCommand方法中定义,onStartCommand有4种返回值: 

        START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

        START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。

         START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

         START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。


什么是BoadcastReceiver

BroadcastReceiver用于接收程序(包括系统程序和一般应用)通过sendBroadcast()方法发出的Broadcast intents。


程序启动BroadcastReceiver的步骤

1) 创建需要启动BroadcastReceiver的Intent。

2) 调用Context的
sendBroadcast
()或s
endOrderedBroadcast
()方法来启动指定的BroadcastReceiver。其中
sendBroadcast
发送的是普通广播,sendOrderedBroadcast发送的是有序广播。

当应用发出一个Broadcast Intent之后所匹配该Intent的组件都可能被启动。


创建BroadcastReceiver的步骤:


第一步:创建BroadcastReceiver的子类:

由于BroadcastReceiver本质上是一种监听器,所以创建BroadcastReceiver的方法也非常简单,只需要创建一个BroadcastReceiver的子类然后重写onReceive (Context context, Intentintent)方法即可。

具体代码如下:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String msg=intent.getExtras().get("msg").toString();
Toast.makeText(context,"intent.getAction()"+intent.getAction().toString(),
Toast.LENGTH_LONG).show();
System.out.println("msg:"+msg);
}
}

   第二步:注册BroadcastReceiver

一旦实现了BroadcastReceiver,接下就应该指定该BroadcastReceiver能匹配的Intent即注册BroadcastReceiver。注册BroadcastReceiver的方式有两种:

第一种是静态注册:这种方法是在配置AndroidManifest.xml配置文件中注册,通过这种方式注册的广播为常驻型广播,也就是说如果应用程序关闭了,有相应事件触发,程序还是会被系统自动调用运行。例如:
<!-- 在配置文件中注册BroadcastReceiver能够匹配的Intent -->
<receiver android:name="com.example.test.MyBroadcastReceiver">
<intent-filter>
</action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</receiver>
   第二种是动态注册:这种方法是通过代码在.Java文件中进行注册。通过这种方式注册的广播为非常驻型广播,即它会跟随Activity的生命周期,所以在Activity结束前我们需要调用unregisterReceiver(receiver)方法移除它。例如:

/通过代码的方式动态注册MyBroadcastReceiver
MyBroadcastReceiver receiver=new MyBroadcastReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("android.intent.action.MyBroadcastReceiver");
//注册receiver
registerReceiver(receiver, filter);
注意:如果我们在Activity中注册了BroadcastReceiver,当这个Activity销毁的时候要主动撤销注册否则会出现异常。方法如下:
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
//当Activity销毁的时候取消注册BroadcastReceiver
unregisterReceiver(receiver);
}


好了不废话了,下面进入到当App想要开机自启动时所需要的代码。

第一步:首先创建一个广播接收者,重构其抽象方法 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,XXX.class);  //这里XXX.class就是主程序入口,默认都是MainActivity.class
context.startService(service);
Log.v("TAG", "开机自动服务自动启动.....");
//启动应用,参数为需要自动启动的应用的包名
Intent intent1 = getPackageManager().getLaunchIntentForPackage("com.example.m"); //包名写成自己程序包名
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" /> 

完成以上操作之后,run一下app然后重启手机即可,本人在真机下测试可行,不知道模拟器的情况。

如有什么不懂的地方可以提出来一起探讨。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息