巧用BroadcastReceiver實現開機“自”啟動

在使用智能手機的時候,有些程序是一直伴隨這我們的,或者說是需要實時反饋和交互的,例如我們手機的主題界面,鬧鐘程序等等。對於這些程序,我們自然而然的會希望他們能夠開機自啟動,因為這樣子可以避免忘記手動開啟某些程序,例如日常鬧鐘等等,並且省瞭很多繁瑣的事情。

 

        正如高煥堂先生總結Android框架時所說的“Don'tcall me, I'll call you back!”,在Android中,不同組件之間的調用往往是基於消息觸發,而不是簡單的事件調用。在Android中,廣播機制也很好的貫徹瞭這個思想。下面這個程序,將會演示如何利用BroadcastReceiver來實現Activity和Service的開機自啟動。

 

實現原理:當Android啟動時,會發出一個系統廣播,內容為ACTION_BOOT_COMPLETED,它的字符串常量表示為android.intent.action.BOOT_COMPLETED。所以,隻要在BroadcastReceiver接收到該消息時,創建並啟動相應的Activity和Service即可實現。

在該程序中,將創建一個BroadcastReceiver類BootBroadcastReceiver、一個Activity類StartOnBootActivity、一個Service類StartOnBootService。程序的示例程序的代碼如下,重點代碼的註解見代碼中註釋部分:

 

 

(1)配置文件“AndroidManifest.xml”

 

[html] <?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="lulicheng.android.onboot" 
    android:versionCode="1" 
    android:versionName="1.0" > 
 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" > 
    </uses-permission> 
 
    <uses-sdk android:minSdkVersion="10" /> 
 
    <application 
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name" > 
        <activity 
            android:name=".StartOnBootActivity" 
            android:label="@string/app_name" > 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
 
        <service android:name=".StartOnBootService" > 
        </service> 
 
        <receiver android:name=".BootBroadcastReceiver" > 
            <intent-filter> 
                <action android:name="android.intent.action.BOOT_COMPLETED" /> 
            </intent-filter> 
        </receiver> 
    </application> 
 
</manifest> 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="lulicheng.android.onboot"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" >
    </uses-permission>

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".StartOnBootActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name=".StartOnBootService" >
        </service>

        <receiver android:name=".BootBroadcastReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

 

 

在該配置文件中,配置瞭各個組件的基本參數,在使用權限中需要加入“<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED" >”權限,另外還有一點比較重要的就是在BootBroadcastReceiver中添加intent-filter,如此一來BootBroadcastReceiver的onReceiver方法才能被觸發。

 

(2)廣播監聽類“BootBroadcastReceiver”

 

[java] package lulicheng.android.onboot; 
 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
 
public class BootBroadcastReceiver extends BroadcastReceiver { 
 
    // 系統啟動完成  
    static final String ACTION = "android.intent.action.BOOT_COMPLETED"; 
 
    @Override 
    public void onReceive(Context context, Intent intent) { 
        // 當收聽到的事件是“BOOT_COMPLETED”時,就創建並啟動相應的Activity和Service  
        if (intent.getAction().equals(ACTION)) { 
            // 開機啟動的Activity  
            Intent activityIntent = new Intent(context, StartOnBootActivity.class); 
            activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
            // 啟動Activity  
            context.startActivity(activityIntent); 
 
            // 開機啟動的Service  
            Intent serviceIntent = new Intent(context, StartOnBootService.class); 
            // 啟動Service  
            context.startService(serviceIntent); 
        } 
    } 
 

 
(3)“StartOnBootActivity” 
package lulicheng.android.onboot; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
 
public class StartOnBootActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        // 設置Activity的顯示內容為一個文本域  
        TextView aTextView = new TextView(this); 
        aTextView.setText("Wow!I started after cellphone boot."); 
        setContentView(aTextView); 
    } 

 
(4)“StartOnBootService” 
package lulicheng.android.onboot; 
 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.widget.Toast; 
 
public class StartOnBootService extends Service { 
 
    @Override 
    public IBinder onBind(Intent intent) { 
        return null; 
    } 
 
    @Override 
    public void onStart(Intent intent, int startId) { 
        super.onStart(intent, startId); 
        // Service被啟動時,將會有彈出消息提示[MyService onStart]  
        Toast.makeText(this, "[MyService onStart]", Toast.LENGTH_LONG).show(); 
    } 
 

package lulicheng.android.onboot;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootBroadcastReceiver extends BroadcastReceiver {

 // 系統啟動完成
 static final String ACTION = "android.intent.action.BOOT_COMPLETED";

 @Override
 public void onReceive(Context context, Intent intent) {
  // 當收聽到的事件是“BOOT_COMPLETED”時,就創建並啟動相應的Activity和Service
  if (intent.getAction().equals(ACTION)) {
   // 開機啟動的Activity
   Intent activityIntent = new Intent(context, StartOnBootActivity.class);
   activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   // 啟動Activity
   context.startActivity(activityIntent);

   // 開機啟動的Service
   Intent serviceIntent = new Intent(context, StartOnBootService.class);
   // 啟動Service
   context.startService(serviceIntent);
  }
 }

}

(3)“StartOnBootActivity”
package lulicheng.android.onboot;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class StartOnBootActivity extends Activity {
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // 設置Activity的顯示內容為一個文本域
  TextView aTextView = new TextView(this);
  aTextView.setText("Wow!I started after cellphone boot.");
  setContentView(aTextView);
 }
}

(4)“StartOnBootService”
package lulicheng.android.onboot;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class StartOnBootService extends Service {

 @Override
 public IBinder onBind(Intent intent) {
  return null;
 }

 @Override
 public void onStart(Intent intent, int startId) {
  super.onStart(intent, startId);
  // Service被啟動時,將會有彈出消息提示[MyService onStart]
  Toast.makeText(this, "[MyService onStart]", Toast.LENGTH_LONG).show();
 }

}

 

程序實現後,在手機或者模擬器上面安裝,然後重啟機器,就能在開機進入系統之後看到該Activity界面以及Service的彈出消息。程序的運行截屏如下圖:

 

作者:陸利成

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *