Как автоматически запустить AlarmManager для запуска запланированной активности? - PullRequest
3 голосов
/ 22 февраля 2012

Это руководство взято с android-er , Основное действие (AndroidScheduledActivity.java) запускает AlarmManager для повторного запуска BroadcastReceiver (MyScheduledReceiver.java). В методе onReceive () MyScheduledReceiver он запускает другое действие (MyScheduledActivity.java) косвенно. Таким образом, действие (MyScheduledActivity.java) будет запускаться в запланированный интервал. Теперь я бы использовал AutoStart для автоматического запуска, но я не смог написать AutoStartNotifyReceiver. пожалуйста, вы можете дать мне представление, как это сделать? Большое спасибо!

основное действие, AndroidScheduledActivity.java:

public class AndroidScheduledActivity extends Activity {

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      Button buttonStart = (Button)findViewById(R.id.start);
      buttonStart.setOnClickListener(new Button.OnClickListener(){

  @Override
  public void onClick(View arg0) {
    Intent myIntent = new Intent(getBaseContext(),
      MyScheduledReceiver.class);

    PendingIntent pendingIntent
     = PendingIntent.getBroadcast(getBaseContext(),
       0, myIntent, 0);

    AlarmManager alarmManager
      = (AlarmManager)getSystemService(ALARM_SERVICE);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 10);
    long interval = 60 * 1000; //
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
      calendar.getTimeInMillis(), interval, pendingIntent);
    finish();
  }});
  }

}

Затем BroadcastReceiver, MyScheduledReceiver.java

public class MyScheduledReceiver extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {

 Intent scheduledIntent = new Intent(context, MyScheduledActivity.class);
 scheduledIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 context.startActivity(scheduledIntent);
}
}

и моя проблема AutoStartNotifyReceiver:

public class AutoStartNotifyReceiver extends BroadcastReceiver {

 private final String BOOT_COMPLETED_ACTION = "android.intent.action.BOOT_COMPLETED";

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

  if(intent.getAction().equals(BOOT_COMPLETED_ACTION)){

????????????????????

  }

 }
}

Ответы [ 2 ]

6 голосов
/ 22 февраля 2012

Ваш класс AutoStartNotifyReceiver extends BroadcastReceiver существует, потому что тревоги сбрасываются при перезагрузке устройства.Итак, в onReceive этого класса (где у вас есть вопросительные знаки) вам нужно заново установить будильник с тем же кодом (без, конечно, finish()), который вы использовали для первого разав onClick методе AndroidScheduledActivity.

Затем вам необходимо добавить следующую запись в Manifest, чтобы система знала, что ваш AutoStartNotifyReceiver должен запускаться при загрузке системы:

<receiver android:name=".AutoStartNotifyReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
</receiver>

Так же как и разрешение в Manifest:

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

Теперь все это предполагает, что у вас есть только один будильник и только один раз настраиваете его.Если это не так, то это немного сложнее.Но, исходя из небольшой информации, которую вы предоставили, мое решение должно делать то, что вы хотите.

Кроме того, поскольку вы новичок здесь, просто любезное напоминание: когда кто-то дает адекватный ответ на вопрос, человек, задающий вопросВопрос (вы) принимаете ответ, установив флажок рядом с ответом.Это так, что отвечающий получает кредит.Добро пожаловать на SO!

1 голос
/ 22 февраля 2012

спасибо, все работает. просто нужно улучшить мою Java немного больше. Я должен добавить «контекст», не знаю точно, почему.

public class AutoStartNotifyReceiver extends BroadcastReceiver {
    private final String BOOT_COMPLETED_ACTION = "android.intent.action.BOOT_COMPLETED";
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(BOOT_COMPLETED_ACTION)){

             Intent myIntent = new Intent(context, MyScheduledReceiver.class);
             PendingIntent pendingIntent = PendingIntent.getBroadcast(context,  0, myIntent, 0);

             AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
             Calendar calendar = Calendar.getInstance();
             calendar.setTimeInMillis(System.currentTimeMillis());
             calendar.add(Calendar.SECOND, 10);
             long interval = 60 * 1000;
             alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), interval, pendingIntent);           
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...