需求:有時候,我們需要自己的程序在開機后自動運行;在關機時,記錄一些信息到文件中.
一、開機廣播監聽
Android系統啟動完成后會自動發出啟動完成廣播(android.intent.action.BOOT_COMPLETED),
所有注冊了接收啟動完成廣播的接收器(BroadcastReceiver)都會收到此廣播.
①編寫一個繼承BroadcastReceiver的類,接受系統啟動完成廣播.
package com.example.systemtest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; /** * 系統啟動完成廣播接收器 * #<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> * @author Lone_Wolf */ public class BootCompletedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { //example:啟動程序 Intent start = new Intent(context, MainActivity.class); start.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// context.startActivity(start); } } }
②在AndroidManifest.xml文件里注冊廣播接收器.
<receiver android:name="com.example.systemtest.BootCompletedReceiver" >
<intent-filter>
<!-- 開機廣播 -->
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
③添加相應權限.
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
二、關機廣播監聽
與開機廣播對應,Android系統在即將關閉時發出系統關閉廣播(android.intent.action.ACTION_SHUTDOWN).
①編寫一個繼承BroadcastReceiver的類,接受系統關閉廣播.
package com.example.systemtest; import java.io.File; import java.io.FileOutputStream; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; /** * 系統關閉廣播接收器 * @author Lone_Wolf */ public class ShutdownReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SHUTDOWN)) { //example:寫入文件 FileOutputStream fos; try { fos = new FileOutputStream( android.os.Environment.getExternalStorageDirectory() + File.separator + "SysLog.txt", true); fos.write("系統退出".getBytes("utf-8")); fos.close(); } catch (Exception e) { e.printStackTrace(); } } } }
②在AndroidManifest.xml文件里注冊廣播接收器.
<receiver android:name="com.example.systemtest.ShutdownReceiver" >
<intent-filter>
<!-- 關機廣播 -->
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
</intent-filter>
</receiver>
注: onReceive中代碼的執行時間不要超過5s,否則android會彈出超時dialog.
如果需要做耗時處理,可以在onReceive()里開始一個Service,讓Service去做耗時處理.
最好不要用子線程,因為BroadcastReceiver的生命周期很短,子線程可能還沒有結束BroadcastReceiver就先結束了.
