应用程序关闭时,Receiver无法运行

时间:2014-02-21 13:35:30

标签: android service broadcastreceiver google-cloud-messaging

在我的应用程序中,我有一个广播接收器,它接收来自GCM推送消息的消息。应用程序打开时它可以正常工作。我的应用程序使用我的消息成功生成通知,然后广播它,当我的MainActivity收到该消息并显示时。

但问题在应用关闭时出现问题。使用消息成功生成通知,但是当mainActivity运行时,无法接收任何内容。

我想将我的接收器与我的应用程序同步,这样如果收到消息并且我的应用程序已经关闭,它必须显示我的消息。但是我尝试在我的活动之外注册另一个接收器,就像它自己的类一样:

public class MahdiReceiver extends BroadcastReceiver {

在清单中注册。 但它不会同步到我的活动因为我需要更多额外的意图来putextra我的消息进行同步。但是这样当我的应用程序打开时它不起作用。因为我得到额外的需求我的活动关闭并再次开放。那么最好的方法是什么?

这是我的MainActivity with receiver:

private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("LOG", "unreciver");
            String newMessage = intent.getExtras().getString(EXTRA_MESSAGE);
            // Waking up mobile if it is sleeping
            WakeLocker.acquire(getApplicationContext());

            /**
             * Take appropriate action on this message
             * depending upon your app requirement
             * For now i am just displaying it on the screen
             * */

            //Showing received message
            //lblMessage.append(newMessage + "\n");
            Log.i("LOG", "unreciver messsage:"+newMessage);
            //Toast.makeText(getApplicationContext(), "New Message: " + newMessage, Toast.LENGTH_LONG).show();
            loadReciverDialog(newMessage);
            // Releasing wake lock
            WakeLocker.release();
        }
    };

这是从GCM接收消息并创建通知的服务部分:

     @Override
        protected void onMessage(Context context, Intent intent) {

            Log.i(TAG, "Received message");
            String message = intent.getExtras().getString("price");

            Log.i("LOG", "GCM service Message "+message);

            displayMessage(context, message);
            // notifies user
            generateNotification(context, message);
        }

 private static void generateNotification(Context context, String message) {

        Log.i("LOG", "genetaret notify");
        int icon = R.drawable.ic_launcher;
        long when = System.currentTimeMillis();
        NotificationManager notificationManager = (NotificationManager)
                context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = new Notification(icon, message, when);

        String title = context.getString(R.string.app_name);

        Intent notificationIntent = new Intent(context, MainActivity.class);

        // set intent so it does not start a new activity
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent intent =
                PendingIntent.getActivity(context, 0, notificationIntent, 0);
        notification.setLatestEventInfo(context, title, message, intent);
        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        // Play default notification sound
        notification.defaults |= Notification.DEFAULT_SOUND;

        //notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "your_sound_file_name.mp3");


        // Vibrate if vibrate is enabled
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        notificationManager.notify(0, notification);      

    }

}

并且此部分显示消息:

  static void displayMessage(Context context, String message) {
        Intent intent = new Intent(DISPLAY_MESSAGE_ACTION);
        intent.putExtra(EXTRA_MESSAGE, message);
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        Log.i("LOG", "commonutils msg="+message);
        context.sendBroadcast(intent);

    }

1 个答案:

答案 0 :(得分:0)

private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver()

您正在运行时创建BroadcastReceiver - 显然,如果您的应用已关闭,它无法接收事件,因为此时它不存在。

要在App关闭时接收事件,您需要创建一个扩展BroadcastReceiver的类,然后在AndroidManifest.xml中注册该类。

您可能需要查看this tutorial