2016-10-22 179 views
1

我正在尋找執行簡單任務的最有效方法。作爲一名新的android開發人員,我不太清楚哪些策略對於我的應用程序在內存效率方面最適合。我想象其中的一些方法可能會導致我不知道的線程問題。Sleep VS alarmManager.set VS alarmManager.setRepeat VS Handler

所有這三種解決方案當前的行爲都符合要求。

這是一個非常簡單的應用程序。這個想法是,我的MainActivity啓動一個IntentService,它將在應用程序打開後在後臺運行。我現在需要的所有功能都是爲了在一天中以相隔一小時的間隔隨機創建通知,無限期地進行,直到用戶停止。該通知以簡單的無效方法進行,將通知顯示爲文字並振動手機一次。

我的MainActivity啓動IntentService:

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Intent intent = new Intent(this, NotificationService.class); 
    startService(intent); 
    } 
} 

我IntentService是非常簡單的。它被稱爲NotificationService,擴展了IntentService,並且只覆蓋了onHandleIntent方法。除了super(「Service」)之外,構造函數是空的。問題在於如何使通知以最有效的方式在後臺全天彈出。在我的實現中,這三個方法都是在onHandleIntent方法中完成的。

方法一:

@Override 
protected void onHandleIntent(Intent intent) { 

    makeNotification(); 

    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

PendingIntent pintent = PendingIntent.getService(
getApplicationContext(), 0, intent, 0); 

alarm.cancel(pintent); 

alarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() 
    + 60000 * 60, pintent); 
} 

注意這一點,用戶必須卸載該應用獲取通知停下來,這是不可取的(雖然我覺得我可以只添加一個按鈕什麼的將取消的意圖)

方法二:

protected void onHandleIntent(Intent intent) { 

makeNotification(); 

    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 

    PendingIntent pintent = PendingIntent.getService(
getApplicationContext(), 0, intent, 0); 

    alarm.cancel(pintent); 

alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() 
    + 60*1000, 60000*60 ,pintent); 
} 

方法三:

@Override 
protected void onHandleIntent(Intent intent) { 

makeNotification(); 

    try { 
     sleep(60000 * 60); 
     startService(intent); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

有人可以幫我決定這三種方法的優缺點嗎?我不知道我理解哪一個是理想的,儘管他們三個都給了我適當的功能。作爲一個側面說明,在我的研究中,我注意到了一個「Handler」類,它在這裏也可能很有用。

回答

1

我現在需要的所有功能都是爲了在一天中間隔一小時(間隔約一小時)隨機創建一個通知,直到用戶停止。

AlarmManager和潛在的JobScheduler是唯一可行的選項。

的想法是,我的MainActivity開始,將在後臺應用程序被打開

不是真的後運行的IntentService。一個IntentService將只會運行,只要它需要完成onHandleIntent()(包括如果連續快速發送N個命令,則執行N次)。一個IntentService可以運行一段時間,但它被設計爲處理某種業務邏輯事務。這是而不是設計爲無限期運行,這樣做會對用戶造成不利影響。

有人可以幫我決定這三種方法的優點/缺點嗎?

選項三不可用。首先,它不可靠,因爲一旦你的流程終止,它停止工作。其次,它無緣無故地捆綁了大量的系統RAM,用戶可以使用更高效的RAM。 Only have a service running when it is actively delivering value to the user。觀看時鐘節拍不會主動向用戶傳遞價值。

我注意到一個「處理器」類,這也可能是有用這裏

沒有,因爲它會從相同的問題,第三個選項吃虧。

關於您的兩個AlarmManager選項,歸結爲您是否需要定期發生的警報(setRepeating())或不規則發生的警報(set())。

如果您選擇setRepeating()選項,請將AlarmManager代碼從服務中移出並放入活動中。在每個警報上沒有指向—和確定成本—調用setRepeating()。畢竟,在setRepeating()後面的那個點是它知道要重複,所以你不必在每一次出現時都告訴它「哦,嘿,我知道我告訴過你最後1,337次你應該重複,但是,呃, ,別忘了重複一下,好嗎?「

隨着set()的選擇,因爲你是專門要求報警重複,你會繼續安排他們的服務(或者是一次從活動,然後從服務的其餘部分),更多的還是儘可能少。

+0

感謝您澄清我使用IntentService的可憐的措辭,並且還提供了一些關於setRepeating/set的正確用法的進一步見解。這非常有幫助! – Jaked222

相關問題