0

メインアクティビティ(OceanintelligenceActivity)があります。このアクティビティでは、プッシュ通知用にデバイスを登録します。また、ダイアログを表示し、サーバーから送信された情報に応じて適切なアクティビティを開始するレシーバーを登録しました。これは、デバイスとレシーバーを登録するために使用しているコードです。

protected void gcmRegistration(){

    PMApplication thisApp = PMApplication.getInstance();
    AppDelegate delegate = thisApp.getAppDelegate();
    final Context context = this;
    // Make sure the device has the proper dependencies.
    GCMRegistrar.checkDevice(this);     
    // Make sure the manifest was properly set - comment out this line
    // while developing the app, then uncomment it when it's ready.     
    GCMRegistrar.checkManifest(this);

    // Let's declare our receiver
    registerReceiver(mHandleMessageReceiver,new IntentFilter(DISPLAY_MESSAGE_ACTION));

    final String regId = GCMRegistrar.getRegistrationId(this);
    if (regId.equals("")) {       
        Log.d("", "Lets register for Push");
        GCMRegistrar.register(this, SENDER_ID);       
    }else {

      if(GCMRegistrar.isRegisteredOnServer(this)) {
          // Skips registration.                          
          String apnsToken = delegate.sso.getAPNSToken();           
          if(!apnsToken.equals(regId)){

            Log.d("", "The Device RegId has changed on GCM Servers");
            // We should let our servers know about this
            ServerUtilities.update(regId, context);
          }


      } else {        

          Log.d("","Is not register on PM Server");               
          // Try to register again, but not in the UI thread.
          // It's also necessary to cancel the thread onDestroy(),
          // hence the use of AsyncTask instead of a raw thread.              
          mRegisterTask = new AsyncTask<Void, Void, Void>() {

              @Override
              protected Void doInBackground(Void... params) {

                  boolean registered = ServerUtilities.register(context, regId);
                  // At this point all attempts to register with the app
                  // server failed, so we need to unregister the device
                  // from GCM - the app will try to register again when
                  // it is restarted. Note that GCM will send an
                  // unregistered callback upon completion, but
                  // GCMIntentService.onUnregistered() will ignore it.
                  if (!registered) {
                      GCMRegistrar.unregister(context);
                  }
                  return null;
              }

              @Override
              protected void onPostExecute(Void result) {
                  mRegisterTask = null;
              }

          };
          mRegisterTask.execute(null, null, null);

      }
    }                         
}

これが私が受信機を設定する方法です:

private final BroadcastReceiver mHandleMessageReceiver =
        new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String newMessage = intent.getExtras().getString(EXTRA_MESSAGE);
        Log.d("","BroadcastReceiver onReceive");  
        notificationIntent = GCMIntentService.getNotificationIntent(context);

        new AlertDialog.Builder(context)
        .setMessage(newMessage+". Would you like to see it right now?")
        .setCancelable(false)
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {                                                       
                // Show update                                                              
                startActivity(notificationIntent);                                                              
            }
        })
        .setNegativeButton("No", null).show();                                    
    }
};

GCMIntentService.getNotificationIntent(context)。この行は、開始したいアクティビティのインテントを返します。

onReceiveが呼び出されるという通知があるときはいつでも、ダイアログは私がメインアクティビティにいる場合にのみ表示されます。そのため、アプリが別のアクティビティを実行している場合onReceiveでも呼び出されますが、ダイアログが表示されないため、適切なアクティビティを開始できません。

BroadcastReceiverで現在表示されているアクティビティに関するダイアログを表示するにはどうすればよいですか?

4

1 に答える 1

0

これで遊んで、グーグルで検索して、私は解決策に出くわしました。最高のものではありませんが、機能します。Androidで現在のコンテキストを取得する簡単な方法がないことを今でも信じられません。したがって、これは、現在のアクティビティに関係なく、ダイアログを表示するために管理したことです。シングルトンクラス(AppDelegate)にContext型のパブリック静的プロパティがあり、各アクティビティでonResumeメソッドをオーバーライドしてContextをに設定します。このAppDelegate.CURRENT_CONTEXT=thisのような現在のアクティビティ。次に、私のダイアログで:AlertDialog.Builder(AppDelegate.CURRENT_CONTEXT)....。

于 2012-12-11T18:50:33.440 に答える