可以通过Android系统中的广播机制实现开机自启动。广播(Broadcast)是Android系统的四大组件之一,通过该机制可以实现不同应用程序之间的通信。
1 开机自启动基本原理
当Android系统开机后,系统会发送一个“已开机”的广播。需要开机自启动的程序接收这个广播,然后启动自己的活动即可。如图1所示。
图1 程序自启动原理
2 自定义广播接收器
在需要自启动的程序中,需要创建广播接收器来接收广播。类BroadcastReceiver表示广播接收器,所以在程序中创建一个该类的派生类即可。
2.1 广播接收器类的创建
选中MainActivity类所在的文件夹,之后在右键菜单中选择“New->Java Class”,弹出“Create New Class”对话框。接下来在该对话框中,将创建的广播接收器类的名称设置为“BootBroadcastReceiver”,并将该类的父类(Superclass)设置为“android.content.BroadcastReceiver”,最后点击“OK”按键,如图2所示。
图2 创建广播接收器类
2.2 广播接收器类的实现
对于自定义的BroadcastReceiver类的派生类,必须重写其父类的onReceive()函数。当广播接收器收到指定的广播后,就会调用该函数。
对于需要开机自启动的程序,其广播接收器收到开机的广播后,就要启动自己的主活动。所以,对于在“2.1 广播接收器类的创建”中创建的BootBroadcastReceiver类来说,其onReceive()函数的主要流程为首先判断收到的广播是否是系统已启动的广播,如果是,则启动自己的主活动。
@Override public void onReceive(Context context, Intent intent){ if(intent.getAction().equals(ACTION)){ Intent myIntent = new Intent(context, MainActivity.class); myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(myIntent); } }
2.2.1 onReceive()方法
该方法有两个参数,其中context表示广播接收器所运行的上下文;intent表示广播接收器收到的Intent。
2.2.2 收到广播类型的判断
在onReceive()方法中,首先通过收到的intent判断广播类型。getAction()方法的作用是获取接收到的Intent的动作。ACTION是定义的字符串。
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
其中,android.intent.action.BOOT_COMPLETED是已开机广播对应的字符串。
2.2.3 启动主活动
当收到的广播是已开机广播,则通过Intent来启动主活动。
其中,MainActivity是主活动对应的类名;addFlags()是Intent类的方法,该方法的作用是设置Intent的属性,FALG_ACTIVITY_NEW_TASK表示创建一个新任务来启动该主活动。最后,通过startActivity()方法启动主活动。
3 在程序中配置广播接收器
可以通过两种方式配置程序的广播接收器,一种是通过安卓API函数实现的动态配置;另一种是通过AndroidManifest.xml实现的静态配置。动态配置必须要在程序启动之后才能接收广播,静态配置可以让程序在未启动的情况下就能接收到广播。对于程序开机自启动的功能,必须要用到静态配置。
3.1 配置接收器
在AndroidManifest.xml文件的<application>标签中,加入如下代码
<receiver android:name=".BootBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
其中,标签<receiver>表示的是广播接收器,“BootBroadcastReceiver”是在“2 自定义广播接收器”中自定义的广播接收器类的名称<intent-filter>指定了该广播接收器接收的广播类型,“android.intent.action.BOOT_COMPLETED”即为系统启动完成的广播。当安卓系统启动完成后,会向所有程序发送系统气功完成的广播,本系统通过以上静态配置,即可接收该广播,并调用自定义类BootBroadcastReceiver的onReceive()方法启动自己的主活动,实现开机自启动功能。
3.2 程序权限的提升
必须提升程序的权限才能收到系统启动完成的广播。权限的提升也是通过在AndroidManifest.xml中进行配置实现的。在<application>标签之外添加如下代码
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
其中,<uses-permission>标签标识应用程序权限,“android.permission.RECEIVE_BOOT_COMPLETED”是系统启动完成广播对应的字符串。以上代码的作用是为程序的用户权限添加接收系统启动完成广播的权限。