Передача другого идентификатора строки из appWidget в один экземпляр действия в задаче - PullRequest
1 голос
/ 05 сентября 2011

То, что я хотел бы сделать, очень похоже на приложение "ColorNote". По сути, у меня есть виджеты приложений, которые могут запускать действие «EditNote», и мне нужен только один экземпляр действия в задаче; Скажем, если пользователь 1. нажимает на виджет А, который запускает «EditNote» A, 2. идет домой, 3. нажимает на виджет B, который запускает «EditNote» B, 4. затем нажимает кнопку НАЗАД, пользователь должен приземлиться на домашнем экране. Я храню rowIds в базе данных sqlite и передаю интересующий идентификатор строки в намерении получить действие «EditNote».

Я попытался установить для "launchMode" значение "singleTask" или "singleInstance", и Android будет обходить "onCreate" и напрямую вызывать "onNewIntent" (что ожидается, как это задокументировано), но проблема заключается в каждом Затем «EditNote» получает то же намерение, которое содержит тот же rowId, поэтому вместо этого будет запущен шаг 3 над «EditNote» A. (Если для «launchMode» задано «standard», то задача будет содержать несколько действий «EditNote» с правильными идентификаторами.)

Это фрагмент кода приложения appWidgetProvider:

int rowId = dataAccess.getIdByAppWidgetId(appWidgetId);
intent.putExtra(NoteColumns.ID, ((Integer)rowId).longValue());  
PendingIntent pending = PendingIntent.getActivity(context, appWidgetId, 
                                intent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.appwidget, pending);
appWidgetManager.updateAppWidget(appWidgetId, views);

Код в активности "EditNote":

@Override
    protected void onNewIntent(Intent intent) {
        Log.d(TAG, "\\\\\\new intent: "
            +" the rowId is "+getIntent().getLongExtra(NoteColumns.ID, -1));
        super.onNewIntent(intent);
    }

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

Самый простой способ сделать это - отредактировать примечание B, переопределить onKeyDown и onKeyUp, чтобы начать новое намерение для домашнего экрана следующим образом:

     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event){
                 if(keyCode==KeyEvent.KEYCODE_BACK){

         Intent startMain = new Intent(Intent.ACTION_MAIN);
         startMain.addCategory(Intent.CATEGORY_HOME);
         startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         startActivity(startMain);
                    return true; //this tells android that you have handled the keypress
             }
             else return false; // this tells android to handle the key press

          return super.onKeyDown(keyCode, event);
         }


        @Override
        public boolean onKeyUp(int keyCode, KeyEvent event){ // in new versions of android, to support canceled button presses on virtual keys, onKeyUp needs to be used
             super.onKeyDown(keyCode, event, mapview);
             if(keyCode==KeyEvent.KEYCODE_BACK){

           Intent startMain = new Intent(Intent.ACTION_MAIN);
           startMain.addCategory(Intent.CATEGORY_HOME);
           startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           startActivity(startMain);
                        return true; //this tells android that you have handled the keypress
                 }
                 else return false; // this tells android to handle the key press
             return super.onKeyUp(keyCode, event);
            }
0 голосов
/ 05 сентября 2011

Оказалось, что это ключ дополнительного, который вошел в намерение, вызвавшее проблему:

intent.putExtra(NoteColumnteger)rowId).longValue()); 

"NoteColumns.ID" был "_id", проблема исчезла, когда немного другойиспользуется ключ:

public static final String ROW_ID  = "rowId";

Загадка остается нерешенной относительно того, почему «_id» работал так, как ожидалось, когда launchMode действия был «стандартным».

...