我是新來的Android的這部分,在這裏我的目標是使用報警管理器運行代碼段每2分鐘將輪詢一個服務器(使用網站的api)返回的JSON會生成通知。 查找網頁後,我認爲在我的情況下最好的選擇之一將使用意向服務和Android。AlarmManager停止從最新的應用程序中刪除應用程序
服務的清單和Recievers
<service
android:name=".NotifyService"
android:enabled="true"
android:exported="false" >
</service>
<receiver
android:name=".TheReceiver"
android:enabled="true"
android:exported="true" >
</receiver>
<receiver
android:name=".OnOffReceiver"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
在閃屏活動,我所說的目的服務,這是負責輪詢通知部分:
Intent msgIntent = new Intent(this, NotifyService.class);
startService(msgIntent);
的接收器開始報警設備啓動:
public class OnOffReceiver extends BroadcastReceiver
{
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
public OnOffReceiver(){}
@Override
public void onReceive(Context context, Intent intent)
{
Intent service = new Intent(context, NotifyService.class);
service.setAction(NotifyService.CREATE);
context.startService(service);
}
}
IntentService類
public class NotifyService extends IntentService
{
public NotifyService()
{
super("NotifyService");
}
public static final int STATUS_RUNNING = 0;
public static final int STATUS_FINISHED = 1;
public static final int STATUS_ERROR = 2;
@Override
protected void onHandleIntent(Intent intent)
{
if (intent != null)
{
final String action = intent.getAction();
}
StartStuff();
}
public void StartStuff()
{
Intent intent = new Intent(this, TheReceiver.class);
PendingIntent pend_intent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,1200,1200, pend_intent);
//1200ms to make it easier to test
}
}
接收器類設置通知,測試章節目標我沒有做任何與網絡相關的工作,這裏只是做一個簡單的通知,檢查,如果應用程序在所有的情況下運行
public class TheReceiver extends BroadcastReceiver
{
public TheReceiver(){}
@Override
public void onReceive(Context context, Intent intent)
{
Toast.makeText(context, " Success ", Toast.LENGTH_SHORT).show();
Log.d("Notification", "The Receiver Successful");
showNotification(context);
}
private void showNotification(Context context)
{
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(context).setContentTitle("My notification").setContentText("Hello World!");
mBuilder.setDefaults(Notification.DEFAULT_SOUND);
mBuilder.setAutoCancel(true);
NotificationManager mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(1, mBuilder.build());
}
}
然而,只有當應用程序正在運行或在最近的應用程序托盤中才會發出通知。 手機重新啓動時不會開始通知,也不會在應用程序從最近的應用程序托盤中移除後通知。
應用程序需要像其他應用程序(如gmail,whatsapp)一樣通知用戶,即使它們已從最近的應用程序托盤中移除。 及時性和準時性不是很大的問題,因爲延遲時間可達5到10分鐘。 (儘管我打算進行2分鐘的輪詢)。
我哪裏錯了?另外,是否有更好的方法去解決這個問題?
現在工作嗎?如果你刷掉應用程序,你的廣播接收器會被叫嗎? –
是的。在當前的實現中,FlashScreen設置警報。然後(在每次警報啓動後),廣播接收器(onReceive)執行IntentService,剩下的所有工作都在那裏完成。即使應用程序從最近的應用程序中刪除,或者設備正在休眠,仍然繼續使用意向服務的所有日誌。 – sky
這不適用於我的情況。我已遵循所有步驟。 –