3

アプリのウィジェットを開発しており、特定のデータをウィジェットからアプリに渡したいと考えています。ユーザーはウィジェットの複数のバージョンを追加できます。アプリで特定の情報を表示できるように、どのウィジェットからのものかを検出する必要があります。

これまでのところ機能していますが、アプリを完全に終了する (戻るボタンを繰り返し押す) 場合のみです。それ以外の場合は、渡されたデータを検出していないようです。

これは、ウィジェットからアプリにデータを渡すために必要なコードです。

public class WidgetProvider extends AppWidgetProvider  {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        final int N = appWidgetIds.length;

        for (int i=0; i<N; i++) 
            UpdateWidget(context, appWidgetManager, appWidgetIds[i]);
    }

    public static void UpdateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)
    {
        Intent intent = new Intent(context, Main.class);
        final Bundle bun = new Bundle();
        bun.putInt("widgetId", appWidgetId);
        intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtras(bun);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
        views.setOnClickPendingIntent(R.id.widgetText, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}

アップデート

Tal Kanel のおかげで、これが機能するようになりました。アプリに があり、ActionBarGoogle のガイドラインに従って、このコードを に持っていますonOptionsItemSelected:

if (item.getItemId() == android.R.id.home) {
          final Intent intent = new Intent(activity, Main.class);
          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
          startActivity(intent);
          return true;
    } 

の「戻る」ボタンをActionBarクリックすると、アプリを最小化してウィジェットをクリックすると、このコードは常に null になります。

    if (getIntent().getExtras() != null)
    {

    }

更新 2

実際、アプリのメイン アクティビティに戻るだけgetExtras()で null になります。アプリのウィジェットにこのコードがあり、アプリに余分なものを渡しません:

    PendingIntent piMain = PendingIntent.getActivity(context, appWidgetId, new Intent(context, Main.class), PendingIntent.FLAG_UPDATE_CURRENT);

    rv.setOnClickPendingIntent(R.id.widgetTitle, piMain);

ウィジェットのその部分をクリックすると、戻ってエクストラを渡すはずのウィジェットの部分をクリックすると、getExtras()常に null になります。

4

1 に答える 1

10

まず第一に、ホーム画面に戻るまで押し戻すと、アプリケーションが実際には閉じません。この段階では、アプリケーションからのアクティビティが存在しないだけです。
あなたがそうしなかった場合に備えて、それを知ることは非常に重要だと思います...

あなたの問題について:
FLAG_ACTIVITY_CLEAR_TOP を使用してウィジェットからアクティビティを起動しようとしています。その定義:

設定されていて、起動されているアクティビティが現在のタスクで既に実行されている場合、そのアクティビティの新しいインスタンスを起動する代わりに、その上にある他のすべてのアクティビティが閉じられ、このインテントがに配信されます (現在上)新しいインテントとしての古いアクティビティ。

つまり、Main アクティビティが既にフォアグラウンドで実行されている場合、ウィジェットからアクティビティを開始すると、この Main アクティビティの上にある他のすべてのアクティビティがスタックから削除され、Main が再開されてActivity.onNewIntent(intent )コールバック。

そのため、データが表示されません。アクティビティは新しいインテントで再開されず、送信した新しいインテントで onNewIntent(intent) に入るだけだからです。

onNewIntent(intent) メソッドにブレーク ポイントを設定すると、送信したインテントがすべてのエクストラ データとともにそこに配信されることがわかります。

コードの別の問題: Intent.putExtras(boundle) メソッドの定義を確認してください。

インテントに一連の拡張データを追加します。キーにはパッケージ プレフィックスを含める必要があります。たとえば、アプリ com.android.contacts は「com.android.contacts.ShowAll」のような名前を使用します。

ルールに従ってキープレフィックスを呼び出さないようです。それがヌルである理由です。

お役に立てば幸いです。

于 2012-07-13T05:59:50.577 に答える