Android app實現靜默安裝並自動開啟,實現開機自啟動,異常崩潰重新啟動,定時關機等
現在很多公司都開始做智慧硬體產品,主要是在Android開發板上面開發應用app,尤其這兩年物聯網越來越火,這方面的需求越來越多,目前公司也是做智慧公交站臺的,需要開發的app實現開機自啟動,異常崩潰重新啟動,版本升級靜默安裝並自動開啟,定時開關機,感覺都要跟Android系統打交道,查了很多資料,開發的時候也遇到很多坑,終於整合完成了,現在連夜分享出去,希望能夠幫到大家:
首先把實現這些功所要用到的許可權全部加入清單檔案中:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permissionandroid:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permissionandroid:name="android.permission.REBOOT" /> <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> <uses-permission android:name="android.permission.DEVICE_POWER" /> <uses-permission android:name="android.permission.SHUTDOWN" /> <uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.SERIAL_PORT" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" /><uses-permission android:name="android.permission.READ_MEDIA_STORAGE" /><uses-permission android:name="android.permission.SET_TIME" /><uses-permission android:name="android.permission.STATUS_BAR" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" /><uses-permission android:name="android.permission.DELETE_CACHE_FILES" /><uses-permission android:name="android.permission.MODIFY_SOUND_SETTINGS" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
1,開機自啟動:開啟一個廣播監控就好了
/** * 我們通過廣播來啟動Activity的時候如果不設定intent的FLAG_ACTIVITY_NEW_TASK屬性,就會報這個異常: * android.util.AndroidRuntimeException: * Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. * 就是說在activity上下文之外呼叫startActivity需要FLAG_ACTIVITY_NEW_TASK屬性。 * * @author Administrator */ public class BootCompletedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //UpdateActivity.class是程式啟動的主Activity Intent intent1 = new Intent(context, UpdateActivity.class); intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent1); } } 還要在清單檔案中註冊廣播:
<!-- Android 開機自啟動示例程式。使用廣播方式接受,採用Android自帶儲存SharedPreferences儲存開機自啟動的設定。 --> <!-- 開機自啟動廣播接受 --> <receiver android:name=".receiver.BootCompletedReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.HOME" /> </intent-filter> </receiver>
2,app崩潰自啟動:在程式入口Application中實現。
不過有些異常崩潰,但是程序並沒有殺死,這種請款就沒效果了,可以參考兄弟部落格(看門狗的實現):https://blog.csdn.net/yunmenggyy/article/details/50320469
public class BaseApplication extends Application { public static Context mContext; public static Context getContext() { return mContext; } @Override public void onCreate() { super.onCreate(); //獲取全域性上下文 mContext = getApplicationContext();//程式崩潰異常捕獲並自動重啟 Thread.setDefaultUncaughtExceptionHandler(restartHandler); } private Thread.UncaughtExceptionHandler restartHandler = new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { Intent intent = new Intent(mContext, UpdateActivity.class); //重啟應用,得使用PendingIntent PendingIntent restartIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); mAlarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 2000, restartIntent); // 2秒鐘後重啟應用 //退出程式 android.os.Process.killProcess(android.os.Process.myPid()); //結束當前程序 } }; }
3,apk實現靜默安裝和自動開啟,這個需要系統簽名,不過做智慧硬體開發都會有系統簽名的,也很簡單,這裡就不說了:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"android:sharedUserId="android:sharedUserId="android.uid.system"">
需要的許可權
<uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
方法:
/** * 說明: * * android.os.Process.killProcess(android.os.Process.myPid());如果不加,最後不會提示完成、開啟。 * * intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);如果不加,最後安裝完成,點開啟,無法開啟新版本應用。 */ private void installAPK() { //apkPath是程式從伺服器上面下載的安裝包儲存位置 String apkPath = Environment.getExternalStorageDirectory().getPath().toString() + File.separator + "test.apk"; Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.fromFile(new File(apkPath)), "application/vnd.android.package-archive"); startActivity(intent); android.os.Process.killProcess(android.os.Process.myPid()); }
4,實現自動開關機功能見部落格:https://blog.csdn.net/qq_29586601/article/details/69257481
只有關機功能,開機功能沒有實現不過Android開發板可以通過電源管理實現自動開機。
總結:這幾個功能基本都要用到系統簽名,上面有很多許可權都是需要系統簽名才有效的,很多會報錯,提示就是要系統簽名才能使用,這個不影響程式的開發,不簽名也可以執行程式,這種報錯可以忽略。
有不當之處請給與提示。目前這些功能全部整合到公司專案中。