2017-12-31 215 views
-1

サービスがあります。アプリケーションを起動するたび、またはデバイスを再起動するたびに起動されますが、最近はサービスが複数回同時に実行できることに気付きました。と呼ばれる、それはちょうど積み重なり、最終的には電池の消耗は非常識になります。開始済みのサービスが既に実行されているかどうかを確認

サービスが既に実行されているかどうかを確認する方法は誰にも分かりますか?ここで

は、サービスを開始するためのコードです:関数内の他のすべてのコードが実行された後に呼び出さのOnCreate機能でMainActivityクラスの

intent = new Intent(Application.Context, typeof(NotificationService)); 
Application.Context.StartService(intent); 

その、。

private void UpdateNotification() 
    { 
     Task.Delay(updateTimer).ContinueWith(t => 
     { 
      ... 

      UpdateNotification(); 

     }, TaskScheduler.FromCurrentSynchronizationContext()); 
    } 

私がそこにいるので、サービスのインスタンスを1つだけ持つようにしたい:

[Service (Label = "ITMNotificationService")] 
class NotificationService : Service 
{ 
    ... 

    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
    { 
     base.OnStartCommand(intent, flags, startId); 

     ... 

     UpdateNotification(); 

     return StartCommandResult.Sticky; 
    } 

    public override IBinder OnBind(Intent intent) 
    { 
     // This is a started service, not a bound service, so we just return null. 
     return null; 
    } 
} 

インサイドiは、すべてのX時間を実行してしまったタスクで次のように

サービスクラスがあります複数のものを持っていて、電池をちょうどぶつける理由はありません。

私がここに追加したサービスに関連するものはすべて、何かが不足している場合はお知らせください。

答えて

1

サービスが複数回起動されている場合、サービスは1つのインスタンスのみを持ちます。複数の呼び出しはstartService()です。

startService()はそれぞれ対応するonStartCommandコールバックを呼び出しますが、同じインスタンス上にあるため、Androidは同じサービスコンポーネントの複数のインスタンスを作成しません。

class NotificationService : Service 
{ 
    ... 
    boolean isStarted = false; 
    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
    { 
     base.OnStartCommand(intent, flags, startId); 

     ... 

     if (!isStarted) { 
      isStarted = true; 
      UpdateNotification(); 
     } 

     return StartCommandResult.Sticky; 
    } 

public override IBinder OnBind(Intent intent) 
{ 
    // This is a started service, not a bound service, so we just return null. 
    return null; 
} 

}

+0

を探していたいくつかの空想のAndroidベースのコードを見つけようとしてよりも簡単であることが判明し

積み重ねられているタスクですか?私は、1秒に1回ではなく、統計の更新を5回以上(開始時刻と時刻に応じて)更新しています。 – Nevaran

+0

onStartCommandのコードは、タスクが既に実行されているときに呼び出されるように処理する必要があります。 – elmorabea

+0

これを行うにはどのようなアイデアですか?私はアンドロイド開発に非常に新しい - 1ヶ月未満です。 – Nevaran

0

@elmorabeaのおかげで、私は、サービスクラスにサービスが開始されているかどうか、あなたがチェックすることができ、そのようにpublic static bool isStarted;を追加しました。それかもしれないが、私は関数の呼び出し(s)はX秒ごとになり、私のサービスにタスクを持って、私は

関連する問題