簡體   English   中英

Android應用程序可以啟動沒有意圖過濾器的活動嗎?

[英]Can Android Application Launch Start an Activity That Has No Intent-Filter?

我的Android應用程序中有許多“內部”活動,我只希望通過編寫的代碼從應用程序內部啟動。 這些“內部”活動在Android清單文件中沒有intent-filter標簽。 我有一個名為SplashActivity的活動,用作具有典型啟動意圖過濾器的初始屏幕:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

我希望/期望每當Android啟動我的應用程序並創建我的自定義Application對象時,它將始終啟動我的SplashActivity。 但是,我的一些用戶遇到了啟動,其中啟動了我的沒有意圖過濾器的“內部”活動之一。 我認為活動通常是該應用程序先前調用中使用的最后一個活動。 我自己無法重現該問題。 但是,在某些情況下,Android將啟動我的應用程序,創建我的自定義Application對象,但啟動我的沒有意圖過濾器的內部活動之一。 Android在什么情況下會這樣做?

要輕松重現Android應用程序啟動會啟動沒有意圖過濾器的活動的情況,請首先對任何此類活動打開應用程序。 按下主屏幕按鈕。 然后使用Android設備監視器(DDMS)查找正在運行您的應用程序的進程並停止/終止該進程。 然后啟動您的應用程序。 Android將創建您的Application對象,但將啟動/恢復上次顯示的活動,而不是使用MAIN LAUNCHER intent-filter啟動該活動。

Android可以隨時終止托管您的應用的OS進程。 通常,當您的應用在后台運行了一段時間(即:用戶離開您的應用導航去執行其他操作)時,通常會發生這種情況。 這事兒常常發生。

然后,當用戶返回到您的應用程序時,Android為該應用程序創建一個新的OS進程,並在堆棧頂部創建一個新的Activity實例(即:在推送該應用程序之前在屏幕上顯示的Activity到背景)。

如果您不希望發生這種情況,可以將以下屬性添加到SplashActivity<activity>聲明中:

android:clearTaskOnLaunch="true"

如果用戶返回,這將迫使Android始終從頭開始重新啟動您的應用。 但是,這可能會使您的用戶抱怨,因為如果用戶使用您的應用程序,然后打了一個電話,然后又返回到您的應用程序,它將從頭開始。

最好是自己檢測問題,然后在必要時重定向到SplashActivity (即:由於進程被SplashActivity並重新啟動而需要初始化您的應用程序時)。 為此,聲明一個在SplashActivityinitializedstatic變量,當您將SplashActivity成功初始化應用程序后,將其設置為true 在每個其他Activity ,在onCreate()

super.onCreate(savedInstanceState);
if (!SplashActivity.initialized) {
    // Android killed my process, need to redirect the user to `SplashActivity`
    redirectIntent = new Intent(this, SplashActivity.class);
    startActivity(redirectIntent);
    finish();
    return;
}

當應用程序仍處於“活動狀態”時,就會發生這種情況。

退出應用程序時,Android不會將其殺死。 它將一直保留在那里直到需要內存。 在這種情況下,當用戶重新啟動時,他將獲得最后一個活動。

你可以嘗試添加

android:clearTaskOnLaunch

清單文件中的根活動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM