2

私のAndroidアプリTransdroidは、いくつかのホーム画面ウィジェットを提供しています。すべてのAppWidgetには2つの「ボタン」(ImageButton)があり、1つはアプリを起動し、もう1つはAppWidgetコンテンツを更新するアクティビティを開始します。ものすごく単純。これがスクリーンショットです。ウィジェットコードは私のGoogleCodeWebサイトにありますが、最も重要なのは次のとおりです。

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_15);
views.setOnClickPendingIntent(R.id.widget_action, PendingIntent.getActivity(context, 0, new Intent(context, Transdroid.class), 0));
appWidgetManager.updateAppWidget(id, views);

問題は、ホームプロセスの再起動後にウィジェットのonUpdateが呼び出されないため、ボタンに機能をアタッチするために使用されるPendingIntentsが失われることです。

再現するのはかなり簡単です。

  1. エミュレータを起動します
  2. ウィジェットを追加します(たとえば、PendingIntentを使用してアクティビティを開始します)
  3. ボタンをクリックして、実際に機能することを確認してください
  4. ホームプロセスを強制的に強制終了します(「adb-e shell kill 96」、ここで96はandroid.process.acoreのPIDです)
  5. ウィジェットのボタンが機能しなくなりました。

より正確には、android.process.acoreホームプロセスが再起動されたときにonReceiveが呼び出されないため、onUpdateは呼び出されません。次に、インテントはアタッチされません。

誰もが同じ問題を経験し、この問題を回避する方法を知っていますか?

4

1 に答える 1

0

自分のアプリウィジェットをいくつかテストしたところ、acoreを強制終了した後、それらのクリックイベントは正常に機能します。これが私の関連するコードです:

    final RemoteViews views = new RemoteViews(context.getPackageName(), layoutId);
    views.setOnClickPendingIntent(R.id.widget_view, PendingIntent.getActivity(
            context, 
            0, 
            new Intent(context, MyActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 
            PendingIntent.FLAG_UPDATE_CURRENT));

私が見ることができる主な違いは、インテント関連のフラグです。彼らは間違いなく試す価値があると思います。[layoutId私のコードのパラメータはelsewereに設定されています。この同じコードは、異なるレイアウトのいくつかのウィジェットに使用されます]。

于 2010-02-26T13:22:29.967 に答える