簡體   English   中英

Android:服務自動重新啟動

[英]Android : Service restarting automatically

我正在使用一項服務,該服務可以不斷保存GPS latlng

但是很多時候該服務會自動重新啟動,從而導致數據丟失...

因此,有什么方法可以限制服務重新啟動。 或解決此問題的任何想法。

您可以做幾件事。 1)分離所有UI生命周期組件,最好使用清單將服務切換到:remote進程。 這樣,如果您的活動崩潰/被殺死,您的服務將不會受到影響,因為它們位於不同的進程中。 查看android IPC(在不同進程上使用本地主機上的套接字時,在活動與該服務之間進行通信的簡單方法)

<service
    android:name="myName.GPS"
    android:enabled="true"
    android:exported="false"
    android:process=":remote">
</service>

2)使其成為高優先級的前台服務(這將創建持久通知)

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //retrieve persisted data here
        final Intent i = new Intent(this, ClassNameOfService.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        final PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0);
        final NotificationCompat.Builder note =
                new NotificationCompat.Builder(this)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.icon))
                        .setSmallIcon(R.drawable.icon)
                        .setContentTitle("GPS Running")
                        .setOngoing(true)
                        .setContentIntent(pi);
        startForeground(10001, note.build()); //replace 10001 with whatever id you like
        return super.onStartCommand(intent, flags, startId);
    }

3)優雅地處理onLowMemory,onDestroy等,以便您可以重新啟動服務。 您可以使用共享首選項,也可以創建sql數據庫來持久化數據,具體取決於您的需求。 您的服務將在某一時刻被殺死。 因此,最好有一個持久性策略。

    @Override
    public void onDestroy() {
    //persist your data here
        super.onDestroy();
}

但是很多時候該服務會自動重新啟動,從而導致數據丟失...

如果您唯一的問題是“數據丟失”,則可以采用一種持久的方式存儲所需的任何數據。 例如使用(SQLite數據庫,SharedPreferences)存儲它

因此,有什么方法可以限制服務重新啟動。

假設您有充分的理由這樣做(我相信並非如此)-當您啟動前台服務時,有一種方法可以將服務作為前台服務啟動 (它將服務與正在進行的不可分散的可見Notification捆綁在一起)-系統會優先級更高-除非它根本沒有任何可用內存來運行當前的前台應用,否則它不會殺死它。

同樣讓我感到討厭的是,您的位置檢索實施並不是最佳方法-如果您的應用需要定期接收位置更新,則應使用Google Play位置服務 您可以將此API與PendingIntent回調一起使用,該回調將在每次根據您提供給它的參數進行位置更新時喚醒您的服務(如果系統停止,則將喚醒整個過程)。 如果您將使用此API,則無需擔心服務會停止的情況,因為Google Play服務進程會在每次有新位置通知您時喚醒您的服務。

您可以通過在清單文件中將其提及為服務來創建新流程

android:process=":newservice"

在服務標簽內

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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