【问题标题】:Android - BroadcastReceiver does not workAndroid - 广播接收器不起作用
【发布时间】:2012-09-21 20:19:14
【问题描述】:

当我Force Close 一个应用程序时,BroadcastReceiver 是否一直在监听意图?

我有这个BroadcastReceiver 类:

public class Receiver extends BroadcastReceiver implements Variables {

    CheckConexion cc;

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

        // Cuando hay un evento, lo diferenciamos y hacemos una acción.

        if (intent.getAction().equals(SMS_RECEIVED)) {
            Sms sms = new Sms(null, contxt);
            sms.uploadNewSms(intent);
        } else if (intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {
            // st.batterylow(contxt);
        } else if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
            /*
             * try { new PhoneState(contxt).battery(intent.getIntExtra("level",
             * 0)); } catch (JSONException e) { e.printStackTrace(); }
             */// Nothing at the moment
        } else if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
            Log.i("******", "Battery on");
        } else if (intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
            // st.power(0, contxt);
        } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)
                || intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED)
                || intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
            Database db = new Database(contxt);
            if (db.open().Preferences(4)) {
                Uri data = intent.getData();
                new ListApps(contxt).import_app(intent, contxt, data,
                        intent.getAction());
            }
            db.close();
        } else if (intent.getAction().equals(
                ConnectivityManager.CONNECTIVITY_ACTION)) {
            cc = new CheckConexion(contxt);
            if (cc.isOnline()) {

                Database db = new Database(contxt);
                db.open();
                if (db.move() == 1) {
                    new UploadOffline(contxt);
                }
                db.close();

            }
        }

    }

    public void register(Context c) {
        IntentFilter i = new IntentFilter();
        i.addAction(SMS_RECEIVED);
        i.addAction(Intent.ACTION_BATTERY_LOW);
        i.addAction(Intent.ACTION_POWER_CONNECTED);
        i.addAction(Intent.ACTION_POWER_DISCONNECTED);
        i.addAction(Intent.ACTION_CALL_BUTTON);
        i.addAction(Intent.ACTION_CAMERA_BUTTON);
        i.addAction(Intent.ACTION_BATTERY_CHANGED);
        i.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        c.registerReceiver(this, i);
        IntentFilter apps = new IntentFilter();
        apps.addAction(Intent.ACTION_PACKAGE_ADDED);
        apps.addAction(Intent.ACTION_PACKAGE_CHANGED);
        apps.addAction(Intent.ACTION_PACKAGE_REMOVED);
        apps.addDataScheme("package");
        c.registerReceiver(this, apps);
    }

    public void unregister(Context c) {
        c.unregisterReceiver(this);
    }
}

我打电话给注册然后我Force Close。我想让BroadcastRecever 继续工作并监听传入的意图。

谢谢。

【问题讨论】:

    标签: android broadcastreceiver forceclose


    【解决方案1】:

    强制关闭您的应用后,广播接收器将无法工作。这是按设计内置在操作系统中的。

    【讨论】:

    • 这不是真的。如果您使用 registerReceiver() 注册接收器,则其生命周期与注册它的对象的生命周期相关。因此,如果您终止应用程序,接收器将不再工作。服务不会工作。您应该在应用的清单中注册您的接收器,以使其按照您的描述工作。
    • Tobias,从 API 版本 12 开始,情况并非如此。请参阅 developer.android.com/about/versions/android-3.1.html,“在已停止的应用程序上启动控件”部分。如果应用程序被强制停止,即使在清单中声明,BroadcastReceivers 也不会工作。
    【解决方案2】:

    在您的manifest 中注册您的接收器。然后它将被永久激活(如果您喜欢使用包管理器,您可以手动启用/禁用它)。

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多