0

Android開発を始めたばかりです。このガイドに従って、Eclipse で App Engine に接続された Android プロジェクトを作成しました: App Engine に接続された Android プロジェクトの作成

アプリは動作しますが、タスクがバックグラウンドになり、GCM メッセージを受信して​​再びアクティブ化されると、GCMIntentService クラスによって呼び出されたインテントが対応するアクティビティに到達しません。何が問題なのですか?

public class GCMIntentService extends GCMBaseIntentService {

    [...]

    @Override
    public void onMessage(Context context, Intent intent) {
        sendNotificationIntent(context, "Message received via Google Cloud Messaging:\n\n" + intent.getStringExtra("message"), true, false);   
    }

    [...]

    private void sendNotificationIntent(Context context, String message, boolean isError, boolean isRegistrationMessage) {

        Intent notificationIntent = new Intent(context, RegisterActivity.class);
        notificationIntent.putExtra("gcmIntentServiceMessage", true);
        notificationIntent.putExtra("registrationMessage", isRegistrationMessage);
        notificationIntent.putExtra("error", isError);
        notificationIntent.putExtra("message", message);
        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(notificationIntent);
    }

    [...]
}

前もって感謝します!

4

3 に答える 3

0

問題はほぼ解決しました...追加する必要がありました:

notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

残っている問題は 1 つだけです。GCM メッセージによってアクティビティが前面に出されたときに、onNewIntent() がまだ起動されていません。代わりにコードを onCreate() に入れました。

于 2013-05-11T14:13:15.910 に答える
0

アクティビティがバックグラウンドにある場合、インテントは receive inonNewIntentであり、onResume の前に呼び出されるため、onNewIntent をオーバーライドする必要があります

@Override
protected void onNewIntent(Intent intent)
{
    super.onNewIntent(intent);

    boolean b = intent.getBooleanExtra("gcmIntentServiceMessage", false);
    ........  
}
于 2013-05-11T05:50:53.800 に答える
0
// add permission  <uses-permission android:name="android.permission.WAKE_LOCK" />


         @Override
      public void onMessage(Context context, Intent intent) {
         sendNotificationIntent(context, "Message received via Google Cloud Messaging:\n\n" + intent.getStringExtra("message"), true, false); 
      context.sendBroadcast(intent) ; 
}

   private void sendNotificationIntent(Context context, String message, boolean isError, boolean isRegistrationMessage) {

    Intent notificationIntent = new Intent(context, RegisterActivity.class);
    notificationIntent.putExtra("gcmIntentServiceMessage", true);
    notificationIntent.putExtra("registrationMessage", isRegistrationMessage);
    notificationIntent.putExtra("error", isError);
    notificationIntent.putExtra("message", message);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);


     NotificationManager notificationManager = 
        (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
     Notification notification = neNotification(R.drawable.ic_launcher,"Title",System.currentTimeMillis());

    PendingIntent intents = PendingIntent.getActivity(context, 0, notificationIntent, Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
    notification.setLatestEventInfo(context , context.getString(R.string.app_name), tickerText , intents );
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(100, notification);
}

    public class AppBroadcastReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    if(intent.getAction() == "AppReceiver") {
       // this intent is gcminit intent and you can get data from this Intent

    }

}

}

   // in menifest file 
      <receiver android:name="AppBroadcastReceiver" >
        <intent-filter>
            <action android:name="AppReceiver" >
            </action>
        </intent-filter>
        </receiver>
于 2013-05-10T07:38:18.143 に答える