[英]Pending Intent Causing mainactivity to reload, why is that?
我正在嘗試編寫一項服務,該服務將在每個午夜檢查服務器中的新數據並將其下載。
但是,當我啟動該應用程序時,mainActivity屏幕會在幾秒鍾后重新加載。 我為此感到高興,它是由於這項服務而發生的,為什么會這樣呢?
她是文件:
MainActivity:我創建了一個AlarmManager對象來設置未決的意圖:
//Set alarm
/* Retrieve a PendingIntent that will perform a broadcast */
Intent alarmIntent = new Intent(getApplicationContext(), AlarmReciever.class);
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0);
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
int interval = 1000 * 24 * 60 * 60;
/* Set the alarm to start at 10:30 AM */
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 00);
calendar.set(Calendar.MINUTE, 00);
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
AlarmReciever:
public class AlarmReciever extends BroadcastReceiver {
private Data newData = null;
public SharedPreferences settings;
ConnectivityManager cm = null;
NetworkInfo netInfo = null;
@Override
public void onReceive(Context context, Intent intent) {
newData = new Data(context);
// TODO Auto-generated method stub
newData.cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
newData.netInfo = newData.cm.getActiveNetworkInfo();
newData.settings = PreferenceManager.getDefaultSharedPreferences(context);
// System.out.print("-----------------" + newData.netInfo);
newData.checkOnline();
}
}
Data.java:
public void checkOnline(){
if (isOnline()){
System.out.print("**************** YES Internet");
firstAsyncTask task = new firstAsyncTask(this);
try {
Object dobj = task.execute("par1", "par 2", "par 3").get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}else{
System.out.print("**************** NO Internet");
}
}
data.java文件很大,可以在這里發布,但是似乎在導致應用程序重新加載MainActivity頁面的“ checkOnline”方法中,我應該以其他方式發送服務嗎?
感謝閱讀和回答。
看來您寫錯了這行
pendingIntent = PendingIntent.getService(getApplicationContext(), 0, alarmIntent, 0);
應該是這樣
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0);
因為您正在使用BroadcastReciever。
導致以下線路網絡訪問?
Object dobj = task.execute("par1", "par 2", "par 3").get();
如果是這樣,那么系統可能會殺死您的進程(用於在主線程上聯網或用於事件循環超時(也稱為ANR)的以太網)。 並最終重新啟動它(如果它有服務)。
在您的Activity
您可以執行以下操作:
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
由於您已將System.currentTimeMillis()
指定為首次觸發時間,因此這將導致立即觸發BroadcastReceiver
。
您可能打算將calendar.getTimeInMillis()
用作第一次觸發警報。 但是,即使將其更改為該日期, 它仍然會立即觸發,因為您已將日歷中的時間設置為當天的 00:00,該日期已經過去了! 您需要使用calendar.getTimeInMillis() + interval
(將是第二天的 00:00,或者可以在使用calendar.getTimeInMillis()
之前向日歷添加1天。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.