首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autostart和BroadcastReceiver

Autostart和BroadcastReceiver
EN

Stack Overflow用户
提问于 2013-01-01 03:00:50
回答 2查看 183关注 0票数 0

我有一个在固定时间执行AlarmReceiver的类(在android启动后启动)。我添加了sharedpreferences来禁用和启用警报。如果我禁用并重新启用,则报警不会运行。我需要重启模拟器。我可以避免模拟器重启吗?谢谢!

代码语言:javascript
复制
public class AutoStart extends BroadcastReceiver {

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    CheckboxPreference = prefs.getBoolean("checkboxPref", true);
Calendar cal4 = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
    cal4.set(Calendar.DATE,31);
    cal4.set(Calendar.MONTH,Calendar.DECEMBER); 
    cal4.set(Calendar.YEAR,2012);//year...
    cal4.set(Calendar.HOUR_OF_DAY, 23);  
    cal4.set(Calendar.MINUTE, 59);       
    cal4.set(Calendar.SECOND, 00);       

Intent intent2 = new Intent(context, AlarmReceiver.class);
    PendingIntent Alarm1 = PendingIntent.getBroadcast(context, 0, intent2, 0);

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal4.getTimeInMillis(), DateUtils.DAY_IN_MILLIS, Alarm1);

清单:

代码语言:javascript
复制
<receiver android:name="AutoStart">
        <intent-filter>
        <action
        android:name="android.intent.action.BOOT_COMPLETED" />
        <category android:name="android.intent.category.HOME" />
        </intent-filter>
        </receiver>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-01 04:09:45

您要做的第一件事是创建一个静态方法,使警报放在AutoStart

代码语言:javascript
复制
public static modifyAlarm (Context context, boolean cancel)
{
  Calendar cal4 = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
  cal4.set(Calendar.DATE,31);
  cal4.set(Calendar.MONTH,Calendar.DECEMBER); 
  cal4.set(Calendar.YEAR,2012);//year...
  cal4.set(Calendar.HOUR_OF_DAY, 23);  
  cal4.set(Calendar.MINUTE, 59);       
  cal4.set(Calendar.SECOND, 00);       

  Intent intent2 = new Intent(context, AlarmReceiver.class);
  PendingIntent Alarm1 = PendingIntent.getBroadcast(context, 0, intent2, 0);

  AlarmManager alarmManager = (AlarmManager) context.getSystemService (Context.ALARM_SERVICE);
  if (cancel)
    alarmManager.cancel (Alarm1);
  else
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal4.getTimeInMillis(), DateUtils.DAY_IN_MILLIS, Alarm1);
}

AutoStartonReceive()中这样调用它:

代码语言:javascript
复制
@Override
public void onReceive (Context context, Intent intent)
{
  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);     
  makeAlarm (context, prefs.getBoolean("checkboxPref", true));
}

现在,您的首选项必须是某个Activity的一部分。为了简单起见,我们将负责处理该活动的onPause()中的警报;

代码语言:javascript
复制
@Override
protected void onPause()
{
  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
  boolean alarmEnabled = prefs.getBoolean("checkboxPref", true);
  AutoStart.modifyAlarm (this, alarmEnabled);
  super.onPause();
}

现在,当用户取消或重新启用您的警报时,您的代码会处理此问题。如果您在PendingIntent上调用cancel,它将在有效时取消警报,如果无效则不执行任何操作,因此我们不必担心检查警报是否已经存在。

票数 1
EN

Stack Overflow用户

发布于 2013-01-01 03:10:10

代码语言:javascript
复制
<receiver android:name=".AutoStart">
        <intent-filter>
           <action android:name="android.intent.action.BOOT_COMPLETED" />
           <category android:name="android.intent.category.HOME" />
        </intent-filter>
</receiver>

更新:

代码语言:javascript
复制
SharedPreferences yourPreferences = getSharedPreferences("prefName", MODE_PRIVATE);
if (!yourPreferences.getBoolean("prefName", false)) {
        Editor editor = yourPreferences.edit();
        editor.clear();
        // add your logic here
        //editor.putBoolean("prefName", false);
        //editor.putInt("userId", -1);
        editor.commit();
 }

然后使用如下所示的代码

代码语言:javascript
复制
userId = yourPreferences.getBoolean("userId", -1);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14105219

复制
相关文章

相似问题

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