2015-06-05 7 views
11

Ich überprüfe, ob der Alarm bereits vom AlarmManager unter Verwendung von this answer eingestellt wurde.Es konnte nicht überprüft werden, ob der Alarm von AlarmManager eingestellt wurde.

Folgendes ist mein Code-Snippet.

boolean alarmUp = (PendingIntent.getBroadcast(MainActivity.this, 0, 
    new Intent(MainActivity.this, AlarmReceiver.class), PendingIntent.FLAG_NO_CREATE) != null); 
if (alarmUp) { 
    // alarm is set; do some stuff 
} 

Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class); 
final PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10 * 1000, pendingIntent); 

Jedoch wird alarmUp immer als wahr festgelegt. Das heißt, ob ich den Alarm einstelle oder nicht, wenn ich meine App neu starte, sage ich, dass alarmUp wahr ist (ich überprüfe es, indem ich eine Toast mache).

Bitte helfen, wo ich falsch liege.

+1

Ich habe nicht gefunden, die see-wenn-die-'PendingIntent'-existiert Technik zuverlässig sein. – CommonsWare

+0

Könnten Sie bitte näher ausführen, oder vielleicht einen Link zur Verfügung stellen, wie man das macht? –

+0

Ich beziehe mich auf den Code in Ihrer Frage. Ich habe den 'FLAG_NO_CREATE' Trick nicht als zuverlässig erkannt. – CommonsWare

Antwort

17

Damit diese Überprüfung funktioniert, müssen Sie absolut sicher sein, dass die PendingIntent nur existiert, wenn der Alarm eingestellt ist. Es gibt 2 Dinge, die Sie tun können, um dies sicherzustellen:

1) Wenn Sie Ihren Code testen, stellen Sie sicher, dass Sie Ihre Anwendung deinstallieren und dann Ihre Anwendung neu installieren, bevor Sie sie testen.Wenn Sie Ihre App deinstallieren, werden alle von Ihrer App erstellten PendingIntent, die noch ausstehen, entfernt.

2) Wenn Sie den Alarm abbrechen, stellen Sie sicher, dass Sie auch die PendingIntent abbrechen. Sie können dies mit

Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class); 
final PendingIntent pendingIntent = 
      PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, 
      PendingIntent.FLAG_NO_CREATE); 
if (pendingIntent != null) { 
    pendingIntent.cancel(); 
} 
0

Seit 21 API können Sie

public AlarmManager.AlarmClockInfo getNextAlarmClock() 

http://developer.android.com/reference/android/app/AlarmManager.html#getNextAlarmClock()


Jetzt verwenden, den Code, den Sie versuchen, zu verwenden:

(PendingIntent.getBroadcast(MainActivity.this, 0, 
    new Intent(MainActivity.this, AlarmReceiver.class), PendingIntent.FLAG_NO_CREATE) != null); 

bassically Sie einen previus fragen und bestehende Absicht namens AlarmReceiver. Aber sein AlarmReceiver bezieht sich auf Ihren eigenen BroadcastReceiver.

Wie Sie in dieser Zeile der Antwort sehen können, die Sie vor posted:

boolean alarmUp = (PendingIntent.getBroadcast(context, 0, 
    new Intent("com.my.package.MY_UNIQUE_ACTION"), 
    PendingIntent.FLAG_NO_CREATE) != null); 

Sie „MY_UNIQUE_ACTION“ verwenden, um festzustellen, ob die Absicht besteht.

Auch in dieser Seite können Sie ein Tutorial sehen mit, dass:

http://justcallmebrian.com/2010/04/27/using-alarmmanager-to-schedule-activities-on-android/


Es sei denn, Sie sind in der Lage, das Android-System AlarmReceiver zugreifen und sehen, ob die Absicht besteht, werden Sie nicht sein kann nach einem generischen geplanten Alarm fragen. Versuchen Sie das zu tun? Wenn dies der Fall ist, sind Sie sicher, dass, falls Sie keinen geplanten Alarm haben, die Absicht des android-systems AlarmReceiver nicht vom System erstellt wurde? Scheint, wir haben keine Kontrolle über diese Komponenten wie wir gerne.


Ein Arbeitsbeispiel: Manifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.blablabla.testa" > 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

     <receiver 
      android:name=".MySuperReceiver" 
      android:label="MySuperReceiverName" /> 

    </activity> 
</application> 

MySuperReceiver.java

package com.blablabla.testa; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

import java.util.Calendar; 

public class MySuperReceiver extends BroadcastReceiver { 
    public static final String TAG = MySuperReceiver.class.getSimpleName(); 
    public static final String ACTION_ALARM_RECEIVER = "ACTION_ALARM_RECEIVER"; 
    private Calendar c = Calendar.getInstance(); 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent != null) 
      if (ACTION_ALARM_RECEIVER.equals(intent.getAction())) { 
       Log.d(TAG, new Exception().getStackTrace()[0].getMethodName() + " " + c.getTime()); 
       //do something here 
      } 
    } 
} 

Und MainActivity.java:

package com.blablabla.testa; 

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 


public class MainActivity extends ActionBarActivity { 

    public static final String TAG = "TEST APP:"; 

    AlarmManager alarmManager; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     GetAlarmService(); 
     CreateAlarm(); 
     CheckForAlarm(); 
     CancelAlarms(); 
     CheckForAlarm(); 
    } 

    private void GetAlarmService() 
    { 
     alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
     Log.d(TAG, " GET Alarm Service ! "); 
    } 
    private void CreateAlarm() 
    { 
     long aroundInterval = 1*60*1000; 

     Intent intent = new Intent(getApplicationContext(), MySuperReceiver.class); 
     intent.setAction(MySuperReceiver.ACTION_ALARM_RECEIVER);//my custom string action name 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//used unique ID as 1001 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), aroundInterval, pendingIntent);//first start will start asap 

     Log.d(TAG, " CREATE Alarm ! "); 
    } 

    private void CancelAlarms() 
    { 
     Intent intent = new Intent(getApplicationContext(), MySuperReceiver.class);//the same as up 
     intent.setAction(MySuperReceiver.ACTION_ALARM_RECEIVER);//the same as up 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//the same as up 
     alarmManager.cancel(pendingIntent);//important 
     pendingIntent.cancel();//important 

     Log.d(TAG, " Cancel Alarm ! "); 
    } 

    private void CheckForAlarm() 
    { 
     //checking if alarm is working with pendingIntent #3 
     Intent intent = new Intent(getApplicationContext() , MySuperReceiver.class);//the same as up 
     intent.setAction(MySuperReceiver.ACTION_ALARM_RECEIVER);//the same as up 
     boolean isWorking = (PendingIntent.getBroadcast(getApplicationContext() , 1001, intent, PendingIntent.FLAG_NO_CREATE) != null);//just changed the flag 
     Log.d("TAG: TEST APP: ", "alarm is " + (isWorking ? "" : "not") + " working..."); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 
+0

Gibt es keine Möglichkeit, API früher als 21 zu arbeiten? Ich möchte nur wissen, ob meine App bereits einen Alarm ausgelöst hat. –

+0

mmm, wenn Sie also einen Alarm mit Ihrem eigenen BroadcastReceiver eingestellt haben, sollten Sie in der Lage sein, dieses Register zu lesen. Hier ist ein weiterer Link mit einem anderen Beispiel: http://blog.mokrzycki.io/2015/01/working-example-of-setting-alarm-with-repeating-stuff-checking-if-alarm-wa-set-with-with- pendingintent/ – mayo

+0

Ich habe das gleiche getan, wie in # 2 in Ihrem Link erwähnt. Und genau das funktioniert nicht, wie in meiner Frage erwähnt. –

Verwandte Themen