2012-06-10 161 views
2

我試圖設置一個報警,將在後臺運行並觸發(最終)保存事件。目前,我只需將此代碼附加到按鈕上。按下按鈕,警報應該開始在後面留下Toast消息,以表明它正在運行。目前一切運行,除了BroadcastReceiver中的onReceive從未觸發。BroadcastReceiver未觸發報警

這裏是我的代碼:

類設置報警:

//FIXME - rename (ie BackgroundSave; more descriptive) 
public class AlarmReceiver extends Service{ 

    //FIXME - make sure you kill the service 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(getApplication().getApplicationContext(), "Service onCreate called", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(getApplication().getApplicationContext(), "Service started", Toast.LENGTH_SHORT).show(); 
     setAlarm(AlarmReceiver.this); 
     // We want this service to continue running until it is explicitly 
     // stopped, so return sticky. 
     return START_STICKY; 
    } 

    public void setAlarm(Context c) { 
     AlarmManager alarmManager = (AlarmManager)c.getSystemService(Context.ALARM_SERVICE); 
     Intent i = new Intent(c, Alarm.class); 
     PendingIntent pi = PendingIntent.getBroadcast(c, 0, i, 0); 
     alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis() + 1000, 1000, pi); 
     Toast.makeText(c.getApplicationContext(), "setAlarm called", Toast.LENGTH_SHORT).show(); 
    } 

    public void cancelAlarm(Context context) { 
     Intent intent = new Intent(context, Alarm.class); 
     PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.cancel(sender); 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 

這裏是廣播接收器:

public class Alarm extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Alarm", Toast.LENGTH_SHORT).show(); 
    } 

} 

這裏是我的清單:

<!-- Alarm --> 
     <service android:name="com.xxxx.android.tools.AlarmReceiver" android:enabled="true" /> 
     <receiver android:name="com.xxxx.android.tools.Alarm" ></receiver> 

onReceive報警從不觸發。

回答

1

使用AlarmManager.ELAPSED_REALTIME_WAKEUP時,必須使用android.os.SystemClock.elapsedRealtime()作爲基準時間。

這就是說我認爲使用AlarmManager來保存目的不是最好的方法。報警管理器相當重量級。您應該考慮使用簡單的處理程序來觸發保存操作。

看看Handler.postAtTime()。

+0

莫里茨先生,就是這樣。我欣賞方向。你在哪裏遇到這些信息?它是否在API中,我掩蓋了它(我有一個可怕的習慣,需要打破。) 至於AlarmManager,只有當用戶由於網絡問題而無法保存其內容時纔會啓動。我的希望是在後臺運行,除非網絡可用,然後關閉。我將調查Handler.postAtTime()。 再次,我感謝幫助。 –

+0

非常有幫助。考慮接受答案。 :)該標誌的詳細信息可以在javadocs中找到:http://developer.android.com/reference/android/app/AlarmManager.html#ELAPSED_REALTIME_WAKEUP – Moritz