2017-08-10 4 views
0

サービスを開始して新しいスレッドを作成します(大きなファイルをダウンロードする)。アプリケーションが正常に動作している - 第1部、第2部、第3部などをダウンロードします。https://youtu.be/qVItEjR00UYXamarin Androidでアクティビティが停止したときにサービスが予期せずクラッシュする

アクティビティを閉じると、時間):https://youtu.be/-Pe-vNgAy1U

なぜですか?私がVisual Studioからアプリケーションを実行するとき、私は同じ状況(エラーメッセージなし)を持っています。

マイサービス:

[Service] 
class DownloadsService : Service 
{ 
    DownloadsBroadcastReceiver receiver; 
    Notification.Builder notificationBuilder; 
    DownloadsData downloadsData; 
    int uniqueNumber = 1000; 
    bool isStarted; 
    bool pauseTask; 

    public override void OnCreate() 
    { 
     base.OnCreate(); 
     RegisterReceiver(receiver, new IntentFilter("com.xamarin.example.TEST")); 
    } 

    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
    { 
     string downloadsDataToParse = intent.GetStringExtra("downloadsData"); 
     if (downloadsDataToParse != null) 
      downloadsData = JsonConvert.DeserializeObject<DownloadsData>(downloadsDataToParse); 
     pauseTask = intent.GetBooleanExtra("pauseTask", false); 
     if (isStarted && !pauseTask) 
      Log.Info("DAMIAN", "Usługa została już wcześniej uruchomiona"); 
     else if (isStarted && pauseTask) 
     { 
      PauseTask(); 
      Log.Info("DAMIAN", "Wstrzymano"); 
      UpdateNotification("Wstrzymano"); 
     } 
     else 
     { 
      Log.Info("DAMIAN", "Usługa została uruchomiona"); 
      DispatchNotificationThatServiceIsRunning(downloadsData.Nazwa, "Rozpoczynanie"); 
      new Thread(new ThreadStart(() => 
      { 
       MakeDownload(downloadsData.Zadania, downloadsData.Nazwa, downloadsData.AccountsList); 
      })).Start(); 
      isStarted = true; 
     } 
     return StartCommandResult.Sticky; 
    } 

    public override IBinder OnBind(Intent intent) 
    { 
     return null; 
    } 

    public override void OnDestroy() 
    { 
     Log.Info("DAMIAN", "Usuwanie usługi"); 
     var notificationManager = (NotificationManager)GetSystemService(NotificationService); 
     notificationManager.Cancel(uniqueNumber); 
     isStarted = false; 
     base.OnDestroy(); 
    } 

    private void DispatchNotificationThatServiceIsRunning(string title, string content) 
    { 
     Intent stopIntent = new Intent(this, typeof(DownloadsBroadcastReceiver)); 
     stopIntent.PutExtra("action", "actionName"); 
     PendingIntent stopPi = PendingIntent.GetBroadcast(this, 4, stopIntent, PendingIntentFlags.UpdateCurrent); 
     Intent intent = new Intent(this, typeof(MainActivity)); 
     TaskStackBuilder stackBuilder = TaskStackBuilder.Create(this); 
     stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(MainActivity))); 
     stackBuilder.AddNextIntent(intent); 
     PendingIntent resultPendingIntent = stackBuilder.GetPendingIntent(0, PendingIntentFlags.UpdateCurrent); 
     Notification.Action pauseAction = new Notification.Action.Builder(Resource.Drawable.Pause, "Wstrzymaj", stopPi).Build(); 
     Notification.Action removeAction = new Notification.Action.Builder(Resource.Drawable.Remove, "Usuń", resultPendingIntent).Build(); 
     notificationBuilder = new Notification.Builder(this) 
      .SetSmallIcon(Resource.Drawable.Icon) 
      .SetContentIntent(resultPendingIntent) 
      .SetContentTitle(title) 
      .SetContentText(content) 
      .AddAction(pauseAction) 
      .AddAction(removeAction); 
     var notificationManager = (NotificationManager)GetSystemService(NotificationService); 
     notificationManager.Notify(uniqueNumber, notificationBuilder.Build()); 
    } 

    private void UpdateNotification(string content) 
    { 
     notificationBuilder.SetContentText(content); 
     var notificationManager = (NotificationManager)GetSystemService(NotificationService); 
     notificationManager.Notify(uniqueNumber, notificationBuilder.Build()); 
    } 

    private void MakeDownload() 
    { 
     //download file 
    } 

    private void PauseTask() 
    { 
     //pause downloading 
    } 
} 

答えて

0

私はフォアグラウンドサービスでこの問題を解決しました。 OnStartCommandで私はStartForeground(uniqueNumber, notification);と呼んでおり、活動は終了した後でも機能します。

1

しかし、私は私の活動を閉じたときに、私のアプリが予期せずに(ではない、すぐにいくつかの時間後)

がバインドを解除しなかったことのように聞こえるクラッシュあなたの活動が閉鎖されたときのサービス。 Bound Service Lifecycleを参照してください。

は、あなたが例えばサービスをバインドする活動のOnStop()またはOnDestroy()方法でサービスをアンバインドしてください:

protected override void OnStop() 
{ 
    UnbindService(serviceConnection); 
    base.OnStop(); 
} 

それとも

protected override void OnDestroy() 
{ 
     base.OnDestroy(); 

     if (isBound) { 
       UnbindService (demoServiceConnection); 
       isBound = false; 
     } 
} 
+0

理解していますが、私の活動が終了したときに実行中のサービスが必要です。 –

関連する問題