【问题标题】:calling function 2 times in android. Not able to prevent clashing of 3 webservices在android中调用函数2次。无法防止 3 个 Web 服务发生冲突
【发布时间】:2016-12-31 08:06:46
【问题描述】:

我正在使用 GCM,但我面临一个问题,即当我收到通知时,我从 onResume() 注册了我的 BroadcastReceiver,但有时我的 onResume() 函数调用了 2 次,因此我遇到了问题.我不明白为什么这工作了 2 次。

gcm Intent 服务类代码:

   if (!extras.isEmpty()) {

        if (GoogleCloudMessaging.
                MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {

            sendNotification(this, msgg);


        } else if (GoogleCloudMessaging.
                MESSAGE_TYPE_DELETED.equals(messageType)) {

            sendNotification(this, msgg);
            updateMyActivity(this, msgg);
            bundle.putString("result", msgg);
            receiver.send(STATUS_FINISHED, bundle);

        } else if (GoogleCloudMessaging.
                MESSAGE_TYPE_MESSAGE.equals(messageType)) {
            updateMyActivity(this,msgg);
            sendNotification(this, msgg);



        }
    }
//    GcmBroadcastReceiver.completeWakefulIntent(intent);
    GcmBroadcastReceiver.completeWakefulIntent(intent);

}



      //This function will create an intent. This intent must take as parameter the "unique_name" that you registered your activity with
static void updateMyActivity(Context context, String message) {


    Log.e(TAG, "updateMyActivity: " );

    Intent intent = new Intent("unique_name");

    //put whatever data you want to send, if any
    intent.putExtra("message", message);

    //send broadcast
    context.sendBroadcast(intent);
}

onResume()活动方法:

       @Override
         public void onStart()
          {
            super.onStart();
              onResume();
          }


@Override
public void onResume() {
    super.onResume();


    IntentFilter intentFilter = new IntentFilter(
            "unique_name");

    mMessageReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            //extract our message from intent
            String msg_for_me = intent.getStringExtra("message");

  }

但我有 2 次“msg_for_me”。检查屏幕截图。 http://prntscr.com/dpzxrs

【问题讨论】:

  • 为什么在onStart中调用onResume?
  • 因为如果我不调用它,那么我的简历功能不会一直有效@2ndGAB
  • “不工作”是什么意思,它不能完成工作或没有被调用。另一件事,是复制/粘贴错误还是您的广播接收器在 onResume() 中?你最好把它放在 onCreate() 然后 registerReceiver() 调用和 unRegisterReceiver() 在 on Destroy()

标签: android push-notification broadcastreceiver


【解决方案1】:

我认为你的代码有几个错误。

首先不要把你BroadcastReceiver放在onResume()中,不要创建intent,因为它是消息传递的并注册BroadcastReceiver

在你MainActivity,你最好这样做:

public class MainActivity extends AppCompatActivity { // or any other Activity like

    private BroadcastReceiver mMessageReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Log.v(Constants.APP_TAG, "MainActivity: onCreate");

        mMessageReceiver  = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                Log.v(Constants.APP_TAG, "MainActivity: mMessageReceiver ");

                String msg_for_me = intent.getStringExtra("message");

            }
        };

        LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver ,
                new IntentFilter(Constants.REGISTRATION_COMPLETE));

    }

    @Override
    protected void onDestroy() {

        Log.v(Constants.APP_TAG, "MainActivity: onDestroy");
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2019-05-07
    相关资源
    最近更新 更多