【问题标题】:Saving alarms to database and resetting (restarting) after reboot将警报保存到数据库并在重新启动后重置(重新启动)
【发布时间】:2013-11-19 20:44:28
【问题描述】:

我希望我的闹钟在设备重启后恢复/重启。在对 Google 进行大量研究后,我发现如果不将警报保存到数据库,它就无法工作。我有两个问题:

2.我应该如何在重新启动时从数据库中读取警报,因为广播接收器没有收到 BOOT_COMPLETED 意图。

1.如何将警报保存到数据库(如何知道数据库已创建并已插入值)?

EDIT:

我已经获得了必要的权限和接收者以及以下代码: 告诉我要在此代码中更改什么? MainActivity.java

 onClick:

int intHrs = SetResetIntervalActivity.intHours;
        int intMins = SetResetIntervalActivity.intMinutes;
        Calendar calendar = Calendar.getInstance();

        calendar.set(Calendar.HOUR_OF_DAY, intHrs);
        calendar.set(Calendar.MINUTE, intMins);
        calendar.set(Calendar.SECOND, 0);

        Intent myIntent = new Intent(
                "com.sang.mobiledata.IntentAction.RECEIVE_RESETCONN_UPDATE");
        myIntent.putExtra("FLAG_KEY", false);
        PendingIntent pi = PendingIntent.getBroadcast(this, 0, myIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager alarmManager = (AlarmManager) this
                .getSystemService(Context.ALARM_SERVICE);

        calendar.setTimeInMillis(System.currentTimeMillis());

        calendar.add(Calendar.SECOND, 10);
        long interval = intHrs * 3600000 + intMins * 60000;
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(), interval, pi);
        long mins = interval / 60000;
        Toast.makeText(
                MainActivity.this,
                "Data Connection will be reset every " + mins
                        + " minute(s).", Toast.LENGTH_SHORT).show();

广播接收器:

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

   if (intent.getAction().equalsIgnoreCase(
            "android.intent.action.BOOT_COMPLETED")) {
 //control never enters here

        boolean blnVar=true;
        blnVar=false;
               ....

清单:

  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
 <receiver
        android:name="com.sang.mobiledata.ResetBroadcastReceiver"
        android:exported="true" >
        <intent-filter>
            <action android:name="com.sang.mobiledata.IntentAction.RECEIVE_RESETCONN_UPDATE" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.sang.mobiledata.IntentAction.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

【问题讨论】:

  • 而不是将警报保存在数据库中(我认为这是不可能的),您应该在设备启动时重新创建警报。
  • 为什么你说BOOT_COMPLETED没有被BroadcastReceiver接收?
  • 如何在重启时重新创建警报?
  • 使用与您在活动中使用相同的语法。在设备启动时执行相同的语法。我为我的应用程序做同样的事情,自过去 44 天以来它运行良好。

标签: android database alarms


【解决方案1】:

当您在特定时间设置警报时,将警报的小时、分钟、秒和 id 的值保存在 sqlite 数据库中。重新启动后,从广播启动服务并在该服务的 onStart() 方法中检索警报值并再次设置使用未决意图的警报。

如果您有任何进一步的疑问,欢迎您询问。

【讨论】:

  • 我从逻辑上知道,它是我正在努力解决的实现。
  • 如何发送DB以及如何检索是个问题。
  • 您在哪里遇到问题?在重启后重置警报?请告诉你到底在哪里挣扎..
  • 以同样的方式存储其他值,在 sqlite 数据库中插入小时、分钟和秒,并在启动完成后获取这些值
  • 我在插入值、接收 BOOT_COMPLETED 意图、读取值和重置警报方面遇到问题。
【解决方案2】:

您可以在设备启动时重新设置警报,而不是将警报保存到数据库,如下所示,

// 广播接收器

public class StartApplication extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // TODO Auto-generated method stub
        context.startService( new Intent ( context, AlarmService.class ) );
    }
}

//报警类

public class AlarmService extends Service
{
    @Override
    public int onStartCommand ( Intent intent,int flags, int startId )
    {
        Intent alarmIntent = new Intent ( this,RepeaterService.class );
        PendingIntent pendingIntent = PendingIntent.getService( this, 0, alarmIntent, 0 );

        AlarmManager alarm = ( AlarmManager )getSystemService( Context.ALARM_SERVICE );
        alarm.setRepeating( AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60*1000, pendingIntent );

        return Service.START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) 
    {
        // TODO Auto-generated method stub
        return null;
    }
}

您需要在AndroidManifest.xml中添加以下权限

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

您可以通过以下方式在 AndroidManifest.xml 中声明您的 BroadcastReceiver,

<receiver android:name="com.example.stackoverflow.StartApplication" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

【讨论】:

  • 好的,把你的&lt;action android:name="com.sang.mobiledata.IntentAction.BOOT_COMPLETED" /&gt;换成&lt;action android:name="android.intent.action.BOOT_COMPLETED" /&gt;
  • 您是否使用任何定制设备?
  • 我正在使用 Nexus 4 (Android 4.3) 并且我已经尝试过换行。最初是您要求我这样做的方式。没用。
  • 我没有 Android 4.3 设备,所以我不能说它是否有效。但在此之上,我的代码可以在我的 Android 4.0.4 中找到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多