【问题标题】:Local Broadcast Manager using an alarm not received by main Activity本地广播管理器使用主活动未收到的警报
【发布时间】:2018-06-23 22:38:39
【问题描述】:

我已经实现了一个警报管理器,它运行良好,每 15 分钟触发一次。现在我想使用警报每 15 分钟调用一次 MainActivity 方法。所以我使用本地广播器到MainActivity (知道这是我手机上正在运行的当前活动) 来传输启动方法的命令。但问题是 MainActivity 没有在 onReceive 方法上接收数据。

报警

@Override
public void onReceive(Context context, Intent intent) {
    cont = context;
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
    wl.acquire();


    String url = intent.getExtras().getString("url");
    Log.w(TAG, "Service " + url);

    new GetJSON_val(){
        @Override
        protected String[] doInBackground(String... url) {
            Some Code...

        @Override
        protected void onPostExecute(String[] result) {
            Some Code...

            // I send the broadcast to main Activity
            Log.e("sender", "Broadcasting message");
            Intent intent = new Intent("custom-event-name");

            intent.putExtra("message", "This is my message!");

            LocalBroadcastManager.getInstance(cont).sendBroadcast(intent);

                }
            }
        }
    }.execute(url);


    // End of alarm code

    wl.release();
}

主要活动

  @Override
  public void onCreate(Bundle savedInstanceState) {
  ...
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
            new IntentFilter("custom-event-name"));
   ...
}
   private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Get extra data included in the Intent
        String message = intent.getStringExtra("message");
        Log.e("receiver", "Got message: " + message);

    }
};

Local Broadcaster 是在 postExecute 方法中的 Alarm 类中创建的。

【问题讨论】:

标签: java android android-intent localbroadcastmanager


【解决方案1】:

我认为问题是您在 onReceive() 中执行长时间运行的任务并访问相同的 context

你不应该在其中执行长时间运行的操作(在考虑接收者被阻塞和候选者被杀死之前,系统允许有 10 秒的超时)。

解决方案

  1. 要么使用goAsync()

  2. 或使用IntentService 用于后台任务并在任务完成后发送广播。

【讨论】:

  • 谢谢这是问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多