Активность не должна зависеть от каких-либо других действий для ярлыков приложений?

Я реализую ярлыки приложений в моем приложении. Когда я пытался открыть ярлык, он открылся нормально, но во время поиска он вылетел, отчет о сбое показал исключение SQLite, поскольку я выбирал данные из БД. Поэтому мой вопрос заключается в том, должны ли ярлыки приложений быть независимыми от других файлы?

    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$3.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));
    }

1 ответ

Решение

Скорее всего, ваша проблема не имеет ничего общего с ярлыками приложений. В качестве эксперимента добавьте <intent-filter> за MAIN/LAUNCHER на ваш SearchActivityТаким образом, ваше приложение теперь имеет две иконки запуска. запуск SearchActivity прямо с домашнего экрана. Скорее всего, у вас будет такой же сбой.

Я думаю, что SearchActivity - и, возможно LeaveManagerActivity - предположим, что пользователь всегда проходит через все действия, связанные с запуском, так что ваша база данных находится в определенном состоянии. Это не всегда будет так. Это может вызывать не только ярлыки приложений, но и другие вещи. Например:

  • Пользователь входит в ваше приложение через активность запуска
  • Пользователь делает что-то, чтобы перейти SearchActivity
  • Пользователь нажимает ГЛАВНАЯ
  • 10 минут, в течение которых Android завершает ваш процесс, чтобы освободить системную память
  • Пользователь возвращается в ваше приложение (значок запуска на главном экране, обзорный экран / список последних задач и т. Д.)

На данный момент Android создаст экземпляр SearchActivity и отправить пользователя туда, так как пользователь был в этой задаче довольно недавно. Как и в сценарии ярлыков вашего приложения, пользователь может оказаться в SearchActivity не посещая активность запуска в течение текущего процесса.

Действия либо должны быть независимыми от всех других действий, либо они должны знать о своих зависимостях и уметь справляться, когда эти зависимости не выполняются (например, перенаправить пользователя обратно к действию средства запуска).

Другие вопросы по тегам