1. 程式人生 > >android開機自啟動app

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); } } }
該類派生自BroadcastReceiver,覆載方法onReceive中,檢測接收到的Intent是否符合BOOT_COMPLETED,如果符合,則啟動MainActivity。 

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>
5、大功告成!

延伸思考:

在多數情況下,要自動執行的不是有介面的程式,而是在後臺執行的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狀態。no broadcast receivedstopped state
具體說明見:
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
我們可以通過

1adb 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