3

Android アプリケーションに GCM を実装しましたが、メッセージの受信で正常に動作しています。BroadcastReceiver は、Google が提供する例に従ってマニフェスト ファイルに設定されます。

私の質問は次のとおりです。ユーザーがアプリケーションを開いていて、そのビューで結果を更新したい場合、どうすればよいですか? BroadCastReceiver が受け取るものは何でも、このアクティビティをリスナーとして登録することを最初に考えていました。ただし、BroadcastReceiver の新しいインスタンスが設定されるため、これはリスナーの静的リストである必要がありますが、おそらくこれはこれを行う方法ではありません。

これは私が現在持っているものです

        public class GCMBroadcastReceiver extends WakefulBroadcastReceiver  {

            @Override
            public void onReceive(Context context, Intent intent) {
                ComponentName comp = new ComponentName(context.getPackageName(),
                        GCMIntentService.class.getName());
                startWakefulService(context, (intent.setComponent(comp)));
                setResultCode(Activity.RESULT_OK);
            }
        }


        public class GCMIntentService extends IntentService {
            public static final int NOTIFICATION_ID = 1;
            private NotificationManager mNotificationManager;
            NotificationCompat.Builder builder;

            public GCMIntentService() {
                super("GCMIntentService");
            }

            @Override
            protected void onHandleIntent(Intent intent) {
                Bundle extras = intent.getExtras();
                GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
                String messageType = gcm.getMessageType(intent);

                if (!extras.isEmpty()) {
                   if (GoogleCloudMessaging.
                            MESSAGE_TYPE_MESSAGE.equals(messageType)) {

                     /** How to check if the activity 
GameActivity is running, and hence send an 
update signal to it? If it's not running a 
notification should be created.
    **/
                   }
                }
                GCMBroadcastReceiver.completeWakefulIntent(intent);
            }
        }

マニフェスト ファイルのこの重要な部分は次のとおりです。

       <receiver
            android:name="q.w.e.gcm.GCMBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />

                <category android:name="q.w" />
            </intent-filter>
        </receiver>

        <service android:name="q.w.e.gcm.GCMIntentService" />

何かアドバイス?

ありがとう!

4

1 に答える 1

3

これを処理するには 2 つの方法があります。

1. アクティビティが実行されているかどうかを確認します。

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
if(componentInfo.getPackageName().equalsIgnoreCase("com.yourpackagename")){
    //Activity Running
    Send a broadcast with the intent-filter which you register in your activity
    where you want to have the updates
} 
else{
    //Activity Not Running
    //Generate Notification
}

2. を使用しSendOrderedBroadcastます。

このブログでは、これを実現する方法について説明します。

于 2013-08-19T10:41:41.733 に答える