首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >永久BroadcastReceiver?

永久BroadcastReceiver?
EN

Stack Overflow用户
提问于 2012-11-08 17:11:56
回答 2查看 938关注 0票数 3

我使用broadcastReceiver在具有闹钟功能的应用程序中触发警报。这个类目前非常简单

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-08 17:15:58

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

不幸的是,没有。当电话关机时,系统会销毁所有挂起的意图。

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

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

代码语言:javascript
复制
<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,因为即使用户从一个时区旅行到另一个时区,您也可能希望您的警报工作。

还有一些类似于广播的东西。

代码语言:javascript
复制
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小部件,它可以与其他安卓组件很好地协同工作。
  • 这不是最简单的解决方案,但如果你想遵循安卓指南,这是不错的选择。

也许还有其他更简单的方法来存储警报,比如使用SharedPreferences

  • 它很容易使用。
  • ,但是你需要修改来以一种友好的方式存储多个警报。

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

  • 它很丑陋,而且不是很难实现...

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

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

票数 4
EN

Stack Overflow用户

发布于 2012-11-08 17:16:29

编辑您的清单文件,

代码语言:javascript
复制
<receiver android:name=".RecieverName" 
             android:enabled="true" 
             android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

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

还声明了它的权限,

代码语言:javascript
复制
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13285852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档