サービスを開始して新しいスレッドを作成します(大きなファイルをダウンロードする)。アプリケーションが正常に動作している - 第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
}
}
理解していますが、私の活動が終了したときに実行中のサービスが必要です。 –