1. 程式人生 > >Android app實現靜默安裝並自動開啟,實現開機自啟動,異常崩潰重新啟動,定時關機等

Android app實現靜默安裝並自動開啟,實現開機自啟動,異常崩潰重新啟動,定時關機等

現在很多公司都開始做智慧硬體產品,主要是在Android開發板上面開發應用app,尤其這兩年物聯網越來越火,這方面的需求越來越多,目前公司也是做智慧公交站臺的,需要開發的app實現開機自啟動,異常崩潰重新啟動,版本升級靜默安裝並自動開啟,定時開關機,感覺都要跟Android系統打交道,查了很多資料,開發的時候也遇到很多坑,終於整合完成了,現在連夜分享出去,希望能夠幫到大家:

首先把實現這些功所要用到的許可權全部加入清單檔案中:


<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission 
android: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-permission
android: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-permission
android: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的時候如果不設定intentFLAG_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開發板可以通過電源管理實現自動開機。

總結:這幾個功能基本都要用到系統簽名,上面有很多許可權都是需要系統簽名才有效的,很多會報錯,提示就是要系統簽名才能使用,這個不影響程式的開發,不簽名也可以執行程式,這種報錯可以忽略。

有不當之處請給與提示。目前這些功能全部整合到公司專案中。