簡體   English   中英

待定意圖導致mainactivity重新加載,為什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM