Android重启App应用

最近有个需求,要求能在应用崩溃时,重启App应用
特此记录下

重启App

Kotlin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
val app = this.applicationContext
val context = this.baseContext
val intent = context.packageManager.getLaunchIntentForPackage(context.packageName)
intent?.putExtra("REBOOT", "reboot")
val pendingIntent = PendingIntent.getActivity(
app,
0,
intent,
PendingIntent.FLAG_ONE_SHOT
)
val alarmManager = app.getSystemService(Context.ALARM_SERVICE) as AlarmManager
// 1秒后启动
alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, pendingIntent)
android.os.Process.killProcess(android.os.Process.myPid())

Java

1
2
3
4
5
6
7
8
9
10
ApplicationContext app = getApplicationContext();
Context context = getBaseContext();
Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
// 带参数
intent.putExtra("REBOOT","reboot");
PendingIntent pendingIntent = PendingIntent.getActivity(app, 0, intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
// 1秒后启动
alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, pendingIntent);
android.os.Process.killProcess(android.os.Process.myPid());

全局捕获错误

基于 Thread.UncaughtExceptionHandler 类可实现捕获错误,避免App应用崩溃停止运行

例如

复写Thread.UncaughtExceptionHandler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CrashHandler(private val app: Context) : Thread.UncaughtExceptionHandler {

override fun uncaughtException(t: Thread, e: Throwable) {
e.printStackTrace()
// 记录日志
val stackTrace = e.stackTrace
val targetStackTrace: StackTraceElement? = stackTrace.first()

if (targetStackTrace != null) {
Log.e(
"程序崩溃错误",
"线程:${t.name}\n位置:${targetStackTrace.className}.${targetStackTrace.methodName}(${targetStackTrace.fileName}:${targetStackTrace.lineNumber})\n报错信息:${e.message ?: e.toString()}"
)
} else {
Log.e("程序崩溃错误", e.message ?: "未知")
}
}
}

于全局里设置默认错误捕获处理

1
2
3
4
5
6
7
class App : Application() {
override fun onCreate() {
super.onCreate()
// 设置全局错误捕获拦截
Thread.setDefaultUncaughtExceptionHandler(CrashHandler(applicationContext))
}
}