2011-09-10 68 views
1

在我的應用程序,我想提供一個動作,這將在後臺定期執行。所以我使用AlarmManager,它啓動一個IntentService。延時服務動作,直到網絡連接可用

棘手的部分是,這樣的背景下行動需要互聯網連接。所以我試着用一個WakeLock,當設備被鎖定時似乎沒有強制執行連接。

然後我想到在服務啓動時註冊BroadcastReceiver來偵聽「android.net.conn.CONNECTIVITY_CHANGE」,並在收到所需的廣播後馬上取消註冊。

我的代碼看起來是這樣的:

public class BackgroundService extends IntentService { 
    private static final IntentFilter filter = 
     new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 
    private static NetworkStateChangedReceiver receiver = 
     new NetworkStateChangedReceiver(); 

    protected void onHandleIntent(Intent intent) { 
     registerReceiver(receiver, filter); 
    } 
} 

我的問題是現在:請問這個接收器被破壞,只要該服務停止(因爲它沒有任何關係,只要沒有連接可用)? 因此,如何才能實現一項服務,延遲它的工作,直到網絡連接可用?

謝謝。

回答

1

一旦服務停止,只要沒有連接可用,這個接收器會被銷燬嗎?

是。它會活幾微秒。

因此,如何才能實現一項服務,延遲它的工作,直到網絡連接可用?

使用ConnectivityManagergetActiveNetworkInfo(),看看是否有一個連接,如果沒有,只是退出onHandleIntent(),等待下一次報警。

或者,註冊您的CONNECTIVITY_ACTION接收器的清單,並用它來安排和取消警報,所以警報纔有效,而有一個連接。

還有其他各種策略,但是這兩個應該給你一個起點。

+0

所以我能做的最好的,是遍地啓動任務,直到建立連接? –

+0

@cypressious:這是一種方法。我概述了兩個,其中一個不符合該描述。 – CommonsWare

+0

我明白了。你的第二個建議是註冊一個永久的BroadcastReceiver。就我而言,任務應該每天執行1-2次。這是不是壞風格,每隔5分鐘處理一次廣播,忽略其中95%? –