2015-03-31 2 views
0

Я написал приложение для Android с помощью Xamarin Studio. Иногда из-за другого кода приложение будет зависать и перестать отвечать. Когда пользователь нажимает кнопку «домой», звук продолжает воспроизводиться, а не останавливаться. Есть ли способ, чтобы приложение «зависало», чтобы знать, что оно было помещено в фоновом режиме и заставить звук приостановить?Есть ли способ остановить звук на Android, когда мое приложение падает или зависает?

protected override void OnDestroy() 
{ 
    DependencyService.Get<IMediaController>().Stop(); 

    // Call base method 
    base.OnDestroy(); 
} 

protected override void OnSleep() 
{ 
    DependencyService.Get<IMediaController>().Pause(); 
} 
+2

Исправьте свой код, который висит. Если его висит, эти функции даже не могут быть вызваны. –

+0

Мы ежедневно работаем над этим. Но до тех пор я просто надеялся на что-то OS-уровень, который мог бы сказать, что сеанс аудио заканчивается, когда приложение задумано. Мой опыт установки аудио-типа приложения ограничен iOS. – Gandalf458

+0

Нет. Приложение может сказать ОС, чтобы закончить звук, когда он был создан, но для этого приложение должно функционировать (ему нужно вызвать его onPause и сделать его там). Это по назначению - многие приложения продолжают воспроизводить аудио, когда они используются в качестве функции. Например, приложение для интернет-радио. ОС не знает, что это не такое приложение и не оставляет его намеренно. –

ответ

0

Я определил, что способ сделать это - следить за запущенными задачами Android. Это позволяет мне определить, было ли мое приложение запроектировано. У меня есть поток, который работает на протяжении всей жизни приложений, и обычно он убит в OnSleep. Если OnSleep не вызывается, то этот поток определит, что приложение не реагирует, и оно будет вызывать OnSleep. Это для Xamarin. Я получил свои идеи с этой должности. how to check the top activity from android app in background service

//Returns the top running task information 
private static ActivityManager activityManager; 
private static Android.App.ActivityManager.RunningTaskInfo runningTaskInfo; 
public static ComponentName GetTopActivity() 
{ 
    if(activityManager == null) 
    { 
     activityManager = (ActivityManager) Application.Context.GetSystemService(Context.ActivityService); 
    } 

    IList<Android.App.ActivityManager.RunningTaskInfo> runningTasks = 
     activityManager.GetRunningTasks(1); 
    if(runningTasks != null && runningTasks.Count > 0) 
    { 
     runningTaskInfo = runningTasks[0]; 
     return runningTaskInfo.TopActivity; 
    } 
    else 
    { 
     return null; 
    } 
} 

//This called from my thread every 2 seconds 
public bool IsAppVisible() 
{ 
    //have to do a complicated version of this to determine the current running tasks  //and whether our app is the most prominent. 
    Android.Content.ComponentName componentName = AndroidUtils.GetTopActivity(); 
    bool isCurrentActivity; 
    if(componentName != null) 
    { 
     isCurrentActivity = string.Compare(componentName.PackageName, "myPackage") == 0; 
    } 
    else 
    { 
     isCurrentActivity = false; 
    } 

    return isCurrentActivity; 
} 

if(DependencyService.Get<IDeviceUtility>().IsAppVisible() == false) 
{ 
    //This needs to be manually called if the app becomes completely unresponive 
    OnSleep(); 
    Debug.WriteLine("App is no longer visible"); 
} 
Смежные вопросы