So rufen Sie die Funktion der Aktivität vom Alarmmanager auf
-
26-10-2019 - |
Frage
Ich habe ein startApplicationService
Methode in einer Aktivität. Deshalb habe ich einen Alarmmanager. startApplicationService
Die Methode ruft den Hintergrunddienst auf. Ich möchte diese Methode in verwenden/aufrufen onReceive
Methode von meinem Alarmmanager. Wie es geht? Bitte hilf mir. :)
Bearbeitet: Alarmmanager -Klasse hinzugefügt:
public class WatcherAlarm extends BroadcastReceiver
{
private final static String LOG_TAG = WatcherAlarm.class.getSimpleName();
private AccessActivity activity = null;
@Override
public void onReceive(Context context, Intent intent)
{
Log.d(LOG_TAG, "-------------------------- WATCHER ALARM ------ ON RECEIVE");
if(activity != null) {
activity.startApplicationService(intent.getExtras());
}
}
public void startAlarm(AccessActivity activity, Bundle bundle)
{
this.activity = activity;
AlarmManager alarmManager = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(activity, WatcherAlarm.class); // explicit
i.putExtras(bundle);
PendingIntent pi = PendingIntent.getBroadcast(activity, 0, i, 0);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 20, pi); // Millisec * Second * Minute
}
public void stopAlarm(Context context)
{
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, WatcherAlarm.class); // explicit
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
alarmManager.cancel(pi);
}
}
Und hier ist das meine startApplicationService
Methode: Es startet Asynctask.
public void startApplicationService(Bundle bundle)
{
try {
task = new ApplicationServiceTask(this);
requestId = task.execute(bundle).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
Ich werde versucht, Aktivität aus dem Kontext zu bekommen. Aber es ist nicht möglich. :(. Gibt es eine Möglichkeit zu sagen? call startApplicationService method to activity
vom Alarmmanager?
Vielen Dank für jeden Rat.
Zeck
Lösung
Nein ... weil Sie keine Garantie dafür haben, dass die Aktivität, die Sie anrufen möchten, sogar existieren, wenn Ihre onReceive()
wird genannt.
Was Sie tun können, ist damit zu beginnen Activity
mit an ein Intent
mit einem zusätzlichen Angeben, dass der Anrufer Sie sind BroadcastReceiver
. Die Aktivität kann dann diese Extra überprüfen und die Methode aufrufen.
Betrachten Sie jedoch, was Sie anscheinend tun möchten. Ich würde empfehlen, mit einem zu gehen Service
. Da Sie die Arbeit im Hintergrund sowieso erledigen, sehe ich keinen Grund dafür, dies in einer Aktivität zu tun (es sei denn natürlich, Sie haben einen gültigen Grund, der hier nicht zeigt).
Siehe meine Antwort hier für ein Beispiel für etwas Ähnliches.