java-为什么在运行异常后Android App自动重启?

我的应用程序在两个5.0的android系统中运行.

 

在我的开发中,我有一个未捕获的RuntimeException

遇到例外时,我的应用程序将自动重启,

我不知道为什么我的应用程序会自动重启?即使我调用System.exit(1)

这是带有RuntimException的日志

 

E/AndroidRuntime(23905): FATAL EXCEPTION: main
E/AndroidRuntime(23905): Process: com.oosmart.mainapp, PID: 23905
E/AndroidRuntime(23905): android.database.sqlite.SQLiteException: no such table: devices (code 1): , while compiling: drop table devices
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1655)
E/AndroidRuntime(23905):    at com.oosmart.mainaplication.db.DBOperation.execute(DBOperation.java:81)
E/AndroidRuntime(23905):    at com.oosmart.mainaplication.db.DevicesDB.dropTable(DevicesDB.java:154)
E/AndroidRuntime(23905):    at com.oosmart.mainaplication.db.DBHelper.DropTable(DBHelper.java:30)
E/AndroidRuntime(23905):    at com.oosmart.mainaplication.fragment.UserCenterFragment.onExitClick(UserCenterFragment.java:128)
E/AndroidRuntime(23905):    at com.oosmart.mainaplication.fragment.UserCenterFragment$$ViewBinder$6.doClick(UserCenterFragment$$ViewBinder.java:74)
E/AndroidRuntime(23905):    at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
E/AndroidRuntime(23905):    at android.view.View.performClick(View.java:4806)
E/AndroidRuntime(23905):    at android.view.View$PerformClick.run(View.java:19952)
E/AndroidRuntime(23905):    at android.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime(23905):    at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime(23905):    at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(23905):    at android.app.ActivityThread.main(ActivityThread.java:5313)
E/AndroidRuntime(23905):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(23905):    at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(23905):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1116)
E/AndroidRuntime(23905):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:809)

这是System.exit的日志

 

I/AndroidRuntime(20479): VM exiting with result code 1, cleanup skipped.
I/AndroidRuntime(23172): VM exiting with result code 1, cleanup skipped.
I/Process (24461): java.lang.RuntimeException

我在运行时使用的grep日志

更新:
即使我调用android.os.Process.killProcess(android.os.Process.myPid());

该应用程序仍然使用新的pid重新启动.
我不知道为什么我不能完全退出代码.

Inm小程序商店 | Vultr中文网

最佳答案

可能是因为您没有完成上一个活动,并且当新活动创建异常时,它关闭了当前活动并打开了上一个活动,并且Runtime Exception崩溃使您的应用程序崩溃,并且您试图删除甚至不存在的表,甚至系统.exit()不会退出您的应用程序.最佳实践是在使用任何复杂的编码时用户尝试捕获.
如果我错了有人纠正我

静默安装并重启 APP 需要获取系统的 Root 权限,因此只有 Root 过的设备才能使用此功能。 以下是一个简单的 Java 代码示例,可以在 Android 设备上静默安装并重启 APP: ```java import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class InstallAndRestartApp { public static void main(String[] args) { String apkPath = "/sdcard/app.apk"; String packageName = "com.example.app"; installAndRestartApp(apkPath, packageName); } private static void installAndRestartApp(String apkPath, String packageName) { try { Process suProcess = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(suProcess.getOutputStream()); os.writeBytes("pm install -r " + apkPath + "\n"); os.flush(); os.writeBytes("am force-stop " + packageName + "\n"); os.flush(); os.writeBytes("am start " + packageName + "\n"); os.flush(); InputStream inputStream = suProcess.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder output = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { output.append(line).append("\n"); } reader.close(); // Wait for the process to finish. int suProcessResult = suProcess.waitFor(); if (suProcessResult == 0) { System.out.println("Installation and restart succeeded."); } else { System.out.println("Installation and restart failed."); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在这段代码中,我们使用 `Runtime.getRuntime().exec("su")` 获取 Root 权限,然后使用 `pm install -r` 命令安装 APK 文件,接着使用 `am force-stop` 命令停止 APP 进程,最后使用 `am start` 命令启动 APP。在命令执行完毕后,我们还可以读取命令输出的结果,并判断命令执行是否成功。 需要注意的是,这段代码只是一个示例,实际使用时应该根据具体需求进行修改,并添加异常处理以提高代码的健壮性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值