0

一定の時間にAlarmReceiverを実行するこのクラス(Androidの起動後に開始)があります。アラームを無効または有効にする共有設定を追加しました。無効にしてから再度有効にすると、アラームが実行されません。エミュレータを再起動する必要があります。エミュレータの再起動を回避できますか?ありがとう!

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);

マニフェスト:

<receiver android:name="AutoStart">
        <intent-filter>
        <action
        android:name="android.intent.action.BOOT_COMPLETED" />
        <category android:name="android.intent.category.HOME" />
        </intent-filter>
        </receiver>
4

2 に答える 2

1

あなたがしたい最初のことは、Alarmにそれを入れさせる静的メソッドを作ることですAutoStart

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);
}

AutoStartこのように'sでそれを呼び出しますonReceive()

@Override
public void onReceive (Context context, Intent intent)
{
  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);     
  makeAlarm (context, prefs.getBoolean("checkboxPref", true));
}

さて、あなたの好みはいくつかの一部でなければなりませんActivity。物事を単純にするために、そのアクティビティのアラームの処理を担当しonPause()ます。

@Override
protected void onPause()
{
  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
  boolean alarmEnabled = prefs.getBoolean("checkboxPref", true);
  AutoStart.modifyAlarm (this, alarmEnabled);
  super.onPause();
}

これで、ユーザーがアラームをキャンセルするか、再度有効にすると、コードがそれを処理します。保留中のインテントでcancelを呼び出すと、有効な場合はキャンセルされ、有効でない場合は何も実行されないため、アラームがすでに存在するかどうかを確認する必要はありません。

于 2012-12-31T20:09:45.320 に答える
0
<receiver android:name=".AutoStart">
        <intent-filter>
           <action android:name="android.intent.action.BOOT_COMPLETED" />
           <category android:name="android.intent.category.HOME" />
        </intent-filter>
</receiver>

アップデート:

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();
 }

次に、次のようなコードを使用します

userId = yourPreferences.getBoolean("userId", -1);
于 2012-12-31T19:10:10.217 に答える