activity 不得与应用程序快捷方式的任何其他活动相互依赖?

activity must not be interdependant on any other activities for app shortcuts?

我正在我的 application.When 中实现应用程序快捷方式 我试图打开我的快捷方式,它打开得很好,但在搜索功能期间它崩溃了 崩溃报告显示 SQLiteexception 因为我正在从数据库中获取数据 所以我的问题是应用程序快捷方式是否应该独立于其他文件?

    01-28 15:25:51.784 12166-12166/ E/AndroidRuntime: FATAL EXCEPTION: main
                                                          Process: , PID: 12166
                                                          android.database.sqlite.SQLiteException: no such table: temp (code 1): , while compiling: SELECT empID, name, firstName, lastName, email, mobile, designation, location, extension FROM temp WHERE name LIKE ?
                                                              at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                              at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
                                                              at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
                                                              at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                              at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                              at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
                                                              at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
                                                              at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1318)
                                                              at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1165)
                                                              at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1036)
                                                              at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1204)
                                                              at com.thbs.database.EmployeeDbAdapter.search(EmployeeDbAdapter.java:194)
                                                              at com.thbs.activity.SearchActivity.onTextChanged(SearchActivity.java:306)
                                                              at android.widget.TextView.sendOnTextChanged(TextView.java:8187)
                                                              at android.widget.TextView.handleTextChanged(TextView.java:8249)
                                                              at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:10371)
                                                              at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:1208)
                                                              at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:578)
                                                              at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:509)
                                                              at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:508)
                                                              at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:844)
                                                              at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:198)
                                                              at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:183)
                                                              at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:353)
                                                              at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:93)
                                                              at android.os.Handler.dispatchMessage(Handler.java:102)
                                                              at android.os.Looper.loop(Looper.java:154)
                                                              at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

通过应用程序打开时它工作正常

我创建应用程序快捷方式的代码是

if (Build.VERSION.SDK_INT >= 25) {
        ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
        ShortcutInfo leaveShortcut = new ShortcutInfo.Builder(this, "shortcut_leave")
                .setShortLabel("Leave Manager")
                .setLongLabel("Leave Manager")
                .setIcon(Icon.createWithResource(this, R.drawable.app_icon))
                .setIntents(
                        new Intent[]{
                                new Intent(Intent.ACTION_MAIN, Uri.EMPTY, this, LeaveManagerActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),
                        })
                .build();
        ShortcutInfo searchShortcut = new ShortcutInfo.Builder(this, "shortcut_search")
                .setShortLabel("Employee search")
                .setLongLabel("Employee search")
                .setIcon(Icon.createWithResource(this, R.drawable.app_icon))
                .setIntents(
                        new Intent[]{
                                new Intent(Intent.ACTION_MAIN, Uri.EMPTY, this, SearchActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),
                        })
                .build();


        shortcutManager.setDynamicShortcuts(Arrays.asList(leaveShortcut, searchShortcut));
    }

很可能,您的问题与应用程序快捷方式无关。作为实验,将 MAIN/LAUNCHER<intent-filter> 添加到您的 SearchActivity,因此您的应用程序现在有两个启动器图标。直接从主屏幕启动 SearchActivity。您很可能会遇到同样的崩溃。

我的猜测是 SearchActivity — 也许 LeaveManagerActivity — 假设用户总是通过您的启动器 activity 是什么,这样您的数据库就处于某种状态。情况并非总是如此。不仅应用程序快捷方式可能会导致这种情况,其他因素也会导致这种情况。例如:

  • 用户通过启动器进入您的应用程序activity
  • 用户做了一些事情去 SearchActivity
  • 用户按下主页
  • 10 分钟过去了,在此期间 Android 终止您的进程以释放系统 RAM
  • 用户 returns 访问您的应用(主屏幕启动器图标、概览 screen/recent-tasks 列表等)

此时,Android 将创建 SearchActivity 的实例并将用户发送到那里,因为用户最近才参与此任务。与您的应用程序快捷方式场景一样,用户可以在当前进程的生命周期内 SearchActivity 结束,而无需访问启动器 activity。

Activity 要么需要独立于所有其他 Activity,要么需要了解它们的依赖关系并能够在不满足这些依赖关系时进行处理(例如,将用户重定向回启动器 activity).