永久BroadcastReceiver?

时间:2012-11-08 09:11:56

标签: android broadcastreceiver

我使用broadcastReceiver在具有闹钟功能的应用中触发闹钟。该课目前非常简单

public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Intent scheduledIntent = new Intent(context, AlarmUp.class);
    scheduledIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(scheduledIntent);

}}

问题是在设备重启时它会被取消,因此警报不会触发。有没有办法让接收器在重启后自动继续? THX

2 个答案:

答案 0 :(得分:4)

  

有没有办法让接收器在a之后自动继续   重新启动吗?

不幸的是没有。当手机关机时,系统会销毁所有待处理的意图。

要解决您的问题,您应该对android.intent.action.BOOT_COMPLETED进行过滤,以便在设备启动时调用BroadcastReceiver。然后,您可以重新安排所有需要的警报。

你的清单中有这样的东西:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver
    android:name=".broadcasts.InitReceiver"
    android:exported="false" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.TIME_SET" />
        <action android:name="android.intent.action.TIMEZONE_CHANGED" />
    </intent-filter>
</receiver>

您可以注意到还有TIME_SETTIMEZONE_CHANGED因为您可能希望您的闹钟工作,即使用户正在从一个时区旅行到另一个时区。

这样的广播节目。

public class YourBroadcastReceiverName extends BroadcastReceiver {

    private AlarmManagerFacade alarmManager;

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

        // Retreive data related to alarms
        Cursor cursor = context.getContentResolver().query(Alarm.CONTENT_URI, null,
                Alarm.COLUMN_ACTIVE + " = ? ",
                new String[] { String.valueOf(1) }, "");

        if (cursor.moveToFirst()) {

            // Schedule all the active alarms.
            alarmManager = new AlarmManagerFacade(context);
            do {
                // TODO : Schedule alarm according to data in cursor.
            } while (cursor.moveToNext());
        }
        cursor.close();
    }
}

(此代码来自我的某个应用。某些对象可能在Android SDK中不可用。)

为了能够重新安排所有闹钟,您需要将它们存储在某个地方

例如,您可以编写自己的ContentProvider

  • 由于CursorAdapter小部件,它适用于其他Android组件。
  • 这不是最简单的解决方案,但如果您想遵循Android指南,那就是要走的路。

可能还有其他更简单的替代方法来存储您的闹钟,例如使用SharedPreferences

  • 它易于使用。
  • 但是你需要以友好的方式存储多个警报。

最后一个选择是你可以创建一个包含信息的对象,将其序列化并将其作为文件存储在SD卡上。

  • 这很丑陋而且不灵活。
  • 但实施起来并不难......

如果您想仔细查看不同的存储选项,可以在此处的文档中阅读:http://developer.android.com/guide/topics/data/data-storage.html

我希望这一切对你有所帮助。 :)

答案 1 :(得分:0)

编辑清单文件,

<receiver android:name=".RecieverName" 
             android:enabled="true" 
             android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

它将在设备重启时自动启动。

也宣布对它的许可,

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>