android在广播接收器BroadcastReceiver里面再进行发送广播,造成当前广播接收器不断循环执行问题

时间:2022-11-18 10:24:50

最近在公司处理项目时,用到锁屏状态弹出activity进行提示,类似QQ消息弹屏提示的功能。当中用到了,假如该弹出activity已经位于锁屏界面外时,将不进行再次弹窗,而是发送广播进行通知数据更新,但是在广播接收器里面的某个步骤进行了再次发送通知的操作,发现该广播接收器变成了一个死循环的执行。经过仔细检查,发现没有任何一处用错action。  最终将该广播接收器里面的发送广播语句注释,死循环不在。代码如下:

注:里面的所有action都经过仔细检查,使用均正确,没任何错误,或者引用错误。

package com.guc.doctorwarn.receiver;

import com.guc.doctorwarn.LocalScreenMessageActivity;
import com.guc.doctorwarn.utils.WakeLock;
import com.library.helper.AppIsBackground;
import com.library.util.PreferencesUtil;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * 该广播用于接收锁屏提示广播
 *
 * @author Administrator
 *
 */

public class LocalScreenMessageReceiver extends BroadcastReceiver {

public static final String LocalScreenMessageAction = "com.guc.doctorwarn.LocalScreenMessageAction";

@Override
 public void onReceive(Context context, Intent intent) {

/**
   * 如果应用在后台,则进行解锁屏幕提示,否则不进行提示
   */

// Log.i("a", ">>>锁屏消息广播接收器接收到消息<<<");

// Log.i("a",
  // ">>>应用是否在后台<<<"
  // + AppIsBackground
  // .isApplicationBroughtToBackground(context));
  if (intent.getAction().equals(LocalScreenMessageAction)) {
   if (AppIsBackground.isApplicationBroughtToBackground(context)
     && !PreferencesUtil.getBoolean(context, "screen")) {

WakeLock.acquireCpuWakeLock(context);

Intent localmessage = new Intent();
    localmessage
      .setClass(context, LocalScreenMessageActivity.class);
    localmessage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    localmessage.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(localmessage);

} else if (!AppIsBackground
     .isApplicationBroughtToBackground(context)
     && PreferencesUtil.getBoolean(context, "screen")) {

// Intent updatamessage = new Intent();
    // updatamessage
    // .setAction(LocalScreenMessageActivity.UpLocalMessageDataAction);
    // context.sendBroadcast(intent);
    //
    Log.i("a", "广播更新锁屏activity执行");

}
  }

}
}

总结:在Android开发过程中,广播接收器里面不可以再次发送广播,否则该广播接收器的运行会进入一个死循环的状态。