【问题标题】:Passing different row id from appWidget to single instance of activity in task将不同的行 ID 从 appWidget 传递到任务中的单个活动实例
【发布时间】:2011-09-05 02:57:58
【问题描述】:

我想做的与“ColorNote”应用程序非常相似。基本上我有可以启动“EditNote”活动的应用程序小部件,我只想要任务中的一个活动实例;假设用户 1. 点击小部件 A 启动“EditNote”A,2.回到家,3.点击小部件 B 启动“EditNote”B,4.然后点击返回按钮,用户应该登陆主屏幕。我将 rowIds 存储在 sqlite 数据库中,并传递感兴趣的行 id 以获取“EditNote”活动。

我尝试将“launchMode”设置为“singleTask”或“singleInstance”,Android 将绕过“onCreate”并直接调用“onNewIntent”(这是预期的,因为它已记录),但问题是每个时间“EditNote”然后获得包含相同 rowId 的相同意图,因此将启动“EditNote”A 上面的第 3 步。 (如果“launchMode”设置为“standard”,则任务将包含多个具有正确 ID 的“EditNote”活动。)

这是appWidgetProvider中的sn-p代码:

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);
    }

【问题讨论】:

  • 事实上,在上面的代码中,EditNote.onNewIntent 从未被调用过。如果我这样说:intent.setData(Uri.withAppendedPath(Uri.parse("ABCD" + "://widget/id/"), String.valueOf(appWidgetId))); onNewIntent 被调用,但我每次都会得到相同的行 ID(即,每次都重新传递第一个传入的行 ID)。希望我在这里遗漏了一些明显的东西!

标签: android android-activity task android-appwidget


【解决方案1】:

最简单的做法是在 Edit Note 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);
            }

【讨论】:

  • 如果用户按下 BACK 按钮返回主屏幕,我已经让它按我想要的方式工作,而无需处理 onKeyUp/Down。问题来自用户直接按下 HOME 按钮并点击新的应用小部件。谢谢。
  • 哦,好的。对不起。我看错了。我以为您的问题出在第 4 步。我更彻底地重新阅读了您的解释,现在我明白了。我正在想办法解决。
【解决方案2】:

事实证明,导致问题的意图是额外的关键:

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

“NoteColumns.ID”是“_id”,当使用稍微不同的键时问题就消失了:

public static final String ROW_ID  = "rowId";

当 Activity 的 launchMode 为“标准”时,为什么“_id”会按预期工作,这个难题仍未解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多