0

即使活动已关闭,我也希望我的应用程序能够正常工作并监听传入的 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();

            }
        }
    }
}

谢谢...

4

1 回答 1

0

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

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

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

于 2012-09-23T00:59:45.650 回答