Android - 保持广播接收器正常工作的最佳方式

时间:2012-09-21 22:10:31

标签: android broadcastreceiver manifest broadcast

即使活动已关闭,我希望我的应用程序能够工作并监听传入的Intent。最好的方法是什么?

我在清单上注册了一个接收器:

    <receiver
        android:name="com.farawayapp.background.Receiver"
        android:exported="false" >
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            <action android:name="android.intent.action.PACKAGE_ADDED" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.intent.action.PACKAGE_CHANGED" />
            <action android:name="android.intent.action.PACKAGE_REMOVED" />

            <data android:scheme="package" />
        </intent-filter>
    </receiver>

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_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_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();

            }
        }
    }
}

...谢谢

1 个答案:

答案 0 :(得分:0)

如果您注册BroadcastReceiver来接收广播,那么即使用户当时没有使用您的应用程序(您的应用程序的任何活动都不在前台),它也会被调用。虽然,您可能想要考虑一些陷阱:

  1. 当设备处于睡眠状态时,大多数意图都不会被广播。只有几个事件会唤醒您的设备(例如来电短信,来电,来自Google Cloud Messaging服务器的推送通知等)。因此,如果您希望应用程序在设备处于睡眠状态时执行某些操作,则应考虑AlarmManager设置将定期调用您的应用程序的警报。

  2. 如果您想在后台进行一些工作,可能需要使用WakeLock来防止设备休眠(以及CPU关闭)。这是来自CommonWare的一个很好的示例,它展示了如何使用WakeLock并为您提供了一个很好的库来缓解您的生活:https://github.com/commonsguy/cwac-wakeful。虽然,WakeLock应该小心,因为它会耗尽电池。