2015-10-07 302 views
7

我想在我的應用程序中使用權限的Android 6,但我看到一個奇怪的事件。也許你可以幫我解決這個問題。Android 6權限=>崩潰時禁用權限,並返回到應用程序

如果您以「危險」權限啓動您的應用程序,這些權限會顯示在您的Android設備的「應用程序權限」中。完善!但是如果你在後臺保留你的應用程序,進入「應用程序權限」菜單,禁用(你可以啓用然後禁用它)權限並返回到你的應用程序,android永遠不會去onStart(片段或活動)?!永遠不要再去那裏。

如果您未觸及權限,或者您啓用了權限=>則轉到onStart和其他人。

這是有問題的,對於爲例,如果您的應用程序使用的聽衆,您不能重新啓動它,你可以有一個崩潰...

你知道哪裏去的Android方法時禁用權限?

我試圖 的onCreate 在onStart 的onResume onRestart onRestoreInstanceState onActionModeStarted onRestoreInstanceState onPostResume onContentChanged

......但沒辦法...:/

+2

「機器人從來沒有去在onStart(片段或活動)!並且永遠不會再去那裏。「 - 如果用戶從設置中撤消權限,則Android會終止您的過程。如果Android在任何其他原因終止您的進程,並且您處於後臺,則以同樣的方式處理此問題。 – CommonsWare

+0

感謝您的回答!我繼續調查,當我創建我的活動時,我顯示1片段,如果我更改權限並返回應用程序,則有2個片段(權限更改之前和之後的片段)。片段是否保留? –

+0

「你知道爲什麼要保留舊的片段嗎?」 - 因爲你的任務仍然非常出色,所以Android正在重新創建活動並盡其所能地恢復其狀態,創建任何現有的片段,如果您進行配置更改(例如,旋轉屏幕),您將獲得相同的結果,因爲您的活動將被銷燬並默認重新創建。它。 – CommonsWare

回答

4

這裏是我的解決方案:

我在mainActi中使用了一些片段VITY。

如你所知,當用戶禁用權限=>辦理的onCreate活性重建,...

我在mainActivity的OnCreate(...)做什麼,我刪除所有加載片段並將我的應用程序置於與第一次運行相同的狀態。

像這樣:

// Clean fragments (only if the app is recreated (When user disable permission)) 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    if (fragmentManager.getBackStackEntryCount() > 0) { 
     fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 

    // Remove previous fragments (case of the app was restarted after changed permission on android 6 and higher) 
    List<Fragment> fragmentList = fragmentManager.getFragments(); 
    if (fragmentList != null) { 
     for (Fragment fragment : fragmentList) { 
      if (fragment != null) { 
       fragmentManager.beginTransaction().remove(fragment).commit(); 
      } 
     } 
    } 

要小心! :我遇到了appcompat和設計庫的版本23.2.0。此應用程序重新創建時出現此崩潰!

點擊此處link瞭解更多信息。

+1

當我們知道活動重新創建?獲取崩潰「片段不再存在」。 – Santosh

1

正如已經指出的正確的android重新啓動您的應用程序。這與您的應用程序在後臺時的行爲相同,因爲使用更多內存,系統會殺死您的應用程序。 當您回到應用程序時,會發生什麼情況是重新創建了最後一個活動包含片段。

通常啓動屏幕(啓動畫面)用於初始化應用程序。 一旦應用程序初始化(例如服務,viewmodel已準備就緒),啓動活動將切換到主要活動。

當應用程序被重新創建(例如撤消權限)時,許多應用程序會發生常見的崩潰,因爲應用程序未初始化並且使用的服務或視圖模型爲空。 我不認爲有一種方法可以避免應用程序重新啓動後最後一次活動的重新創建。

你可以做的是檢查應用程序是否被初始化,否則切換到啓動活動並初始化應用程序。 請注意,您必須處理活動中的單元化應用程序以及碎片。

Xamarin示例代碼:

if (!((MyApplication)ApplicationContext).IsInitialized) 
{ 
    Intent intent = new Intent(Application.Context,typeof(StartupActivity)); 
    intent.SetFlags(ActivityFlags.NewTask); 
    StartActivity(intent); 
    Finish(); 
} 

只要base.onCreate被稱爲創建所述片段所以即使是提供「解決方法」從ACS-球隊沒有避免最後一個片段的娛樂。

利用上述提供的樣本代碼的生命週期將在殼體的活性有片段:

  • 撤銷許可的應用程序就會被殺死
  • 重新啓動應用程序
  • 應用的OnCreate
  • LastActivity.OnCreate
  • LastFragment.OnAttach
  • LastFragment.OnCreate
  • LastFragment.OnCreateView
  • LastFragment.OnViewCreated
  • LastFragment.OnDestroy
  • LastFragment.OnDettach
  • LastActivity.OnDestroy
  • StartupActivity.OnCreate

通過您還可以測試應用程序的方式重新啓動亞行外殼:

打開你的應用程序,然後去和固醇主屏幕,以使您的應用程序在後臺

adb shell "ps | grep <com.yourpackage>" // get the app process id 
adb shell run-as <com.yourpackage> kill <app-process-id> // kill the app 

啓動您的應用程序再次在該圖標或近期任務