Android开机启动Activity或者Service方法
这段时间在做Android的基础开发,现在有一需求是开机启动,按照网上某些博文教程做了下,始终不成功,一开机总是提示所启动的应用程序意外终止,于是参考了Android SDK doc,终于解决问题,下面把自己的经验分享给大家。
Android开机启动Activity或者Service方法
【原理】
当Android系统完成BOOT阶段之后,就会发送一条名为 ACTION_BOOT_COMPLETED 的广播,我们便可在一个BroadcastReceiver中捕获这条广播,然后启动我们的Activity或者Service,当然要注意的是,我们的application必须具有捕获该广播的权限,下面请看具体步骤:
【步骤一】首先要有一个用于开机启动的Activity或者Service,这里以系统自己创建的最简单的Activity为例进行讲解。
1
2
3
4
5
6
7
8
9
10
11
12
13 |
package
com.billhoo.study; import android.app.Activity; import android.os.Bundle; public class BootTestActivity extends
Activity { /** Called when the activity is first created. */ @Override public
void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); } } |
【步骤二】我们要编写一个BroadcastReceiver用以捕获ACTION_BOOT_COMPLETED这条广播,并在捕获之后启动我们要启动的Activity。
注意:必须在intent中添加Intent.FLAG_ACTIVITY_NEW_TASK标记,这就是我之前老是启动失败的原因。因为每个Activity必须建立在一个任务栈中,这个flag指定了Activity的启动模式,这个flag的意思就是在一个新的任务栈中启动。在Activity里面用startActivity这个方法去启动一个新的Activity的时候,Intent有默认的启动模式。而在Activity之外调用startActivity方法时候没有默认的启动模式。比如在service或者broadcastReceiver等,中都需要指定Activity一个启动模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
package
com.billhoo.study; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class BootCompletedReceiver extends
BroadcastReceiver { @Override public
void onReceive(Context context, Intent intent) { if
(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent newIntent = new
Intent(context, BootTestActivity. class ); newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //注意,必须添加这个标记,否则启动会失败 context.startActivity(newIntent); } } } |
【步骤三】在AndroidManifest.xml配置文件中注册我们的BroadcastReceiver
1
2
3
4
5 |
<receiver android:name= ".BootCompletedReceiver" > <intent-filter> <action android:name= "android.intent.action.BOOT_COMPLETED"
/> </intent-filter> </receiver> |
【步骤四】在AndroidManifest.xml配置文件中添加允许我们捕获该广播的权限
1
2 |
<!-- permissions --> <uses-permission android:name= "android.permission.RECEIVE_BOOT_COMPLETED"
/> |
重启虚拟机,大功告成。
下面附上完成的AndroidManifest.xml,以便大家理解参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 |
<?xml version= "1.0"
encoding= "utf-8" ?> <manifest xmlns:android= "http://schemas.android.com/apk/res/android" package = "com.billhoo.study"
android:versionCode= "1" android:versionName= "1.0" > <uses-sdk android:minSdkVersion= "4"
/> <!-- permissions --> <uses-permission android:name= "android.permission.RECEIVE_BOOT_COMPLETED"
/> <application android:icon= "@drawable/icon"
android:label= "@string/app_name" > <!-- activities --> <activity android:name= ".BootTestActivity"
android:label= "@string/app_name" > <intent-filter> <action android:name= "android.intent.action.MAIN"
/> <category android:name= "android.intent.category.LAUNCHER"
/> </intent-filter> </activity> <!-- receivers --> <receiver android:name= ".BootCompletedReceiver" > <intent-filter> <action android:name= "android.intent.action.BOOT_COMPLETED"
/> </intent-filter> </receiver> </application> </manifest> |
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。