android開機自啟動app
前言:
有些時候,應用需要在開機時就自動執行,例如某個自動從網上更新內容的後臺service。怎樣實現開機自動執行的應用?在撰寫本文時,聯想到高煥堂先生以“Don't call me, I'll call you back!”總結Android框架,真是說到點子上了。理解這句話的含義,許多有關Android平臺上實現某種功能的問題,都能迎刃而解。
使用場景:
手機開機後,自動執行程式。
{只是最近本人在做萬達大歌星點餐系統,需要用到系統啟動直接啟動App避免服務員玩別的app才研究的,以下分享是本人蔘考網路,親自嘗試成功的程式碼,貼出來與大家分享,希望能幫助更多的人!不懂的可以問我哦。QQ:11745405
背景知識:
當Android啟動時,會發出一個系統廣播,內容為ACTION_BOOT_COMPLETED,它的字串常量表示為android.intent.action.BOOT_COMPLETED。只要在程式中“捕捉”到這個訊息,再啟動之即可。記住,Android框架說:Don't call me, I'll call you back。我們要做的是等到接收這個訊息,而實現的手段就是實現一個BroadcastReceiver。
程式碼解析:
1、介面MainActivity.java
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.example;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.*;
import android.widget.Toast;
public class MainActivity extends Activity { //
收到訊息啟動此Activity
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState); super .setIntegerProperty( "splashscreen" , R.drawable.wandapad_splash);
TextView tv = new TextView( this );
tv.setText( "Hello這是MainActivity" );
setContentView(tv);
}
|
2、接收廣播訊息:BootBroadcastReceiver.java
?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 |
package com.example;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
* Created with IntelliJ IDEA.
* User: 郟高陽
* Date: 13-6-5
* Time: 下午8:25
* To change this template use File | Settings | File Templates.
*/
public class BootBroadcastReceiver extends BroadcastReceiver
{
static final String ACTION = "android.intent.action.BOOT_COMPLETED" ;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION)) {
Intent mainActivityIntent = new Intent(context, MainActivity. class ); //
要啟動的Activity
mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainActivityIntent);
}
}
}
|
3、配置檔案:AndroidManifest.xml
在application內新增一下配置:
?1 2 3 4 5 |
< receiver android:name = ".BootBroadcastReceiver" >
< intent-filter >
< action android:name = "android.intent.action.BOOT_COMPLETED" />
</ intent-filter >
</ receiver >
|
向系統註冊了一個receiver,子節點intent-filter表示接收android.intent.action.BOOT_COMPLETED訊息。
4、在manifest中新增以下許可權
?1 |
< uses-permission android:name = "android.permission.RECEIVE_BOOT_COMPLETED" ></ uses-permission >
|
延伸思考:
在多數情況下,要自動執行的不是有介面的程式,而是在後臺執行的service。此時,就要用startService來啟動相應的service了。
2、自啟動失敗的原因
接收不到BOOT_COMPLETED廣播可能的原因
(1)、BOOT_COMPLETED對應的action和uses-permission沒有一起新增
(2)、應用安裝到了sd卡內,安裝在sd卡內的應用是收不到BOOT_COMPLETED廣播的
(3)、系統開啟了Fast Boot模式,這種模式下系統啟動並不會傳送BOOT_COMPLETED廣播
(4)、應用程式安裝後重來沒有啟動過,這種情況下應用程式接收不到任何廣播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等。
Android3.1之後,系統為了加強了安全性控制,應用程式安裝後或是(設定)應用管理中被強制關閉後處於stopped狀態,在這種狀態下接收不到任何廣播,除非廣播帶有FLAG_INCLUDE_STOPPED_PACKAGES標誌,而預設所有系統廣播都是FLAG_EXCLUDE_STOPPED_PACKAGES的,所以就沒法通過系統廣播自啟動了。所以Android3.1之後
(1)、應用程式無法在安裝後自己啟動
(2)、沒有ui的程式必須通過其他應用啟用才能啟動,如它的Activity、Service、Content Provider被其他應用呼叫。
存在一種例外,就是應用程式被adb push you.apk /system/app/下是會自動啟動的,不處於stopped狀態。
具體說明見:
http://developer.android.com/about/versions/android-3.1.html#launchcontrols
http://commonsware.com/blog/2011/07/13/boot-completed-regression-confirmed.html
3、adb傳送BOOT_COMPLETED
我們可以通過
1 | adb shell am broadcast-aandroid.intent.action.BOOT_COMPLETED |
命令傳送BOOT_COMPLETED廣播,而不用重啟測試機或模擬器來測試BOOT_COMPLETED廣播,這條命令可以更精確的傳送到某個package,如下:
1 | adb shell am broadcast-aandroid.intent.action.BOOT_COMPLETED-candroid.intent.category.HOME-npackage_name/class_name |