簡體   English   中英

Android Home活動啟動子活動

[英]Android Home activity launching a sub-activity

我對Android編程比較陌生。 我在工作中得到了一項任務,我需要創建一個自定義主頁活動啟動器。 我做了一些研究,並在Android開發者網站( 主頁樣本 )上找到了這個例子。 這是我原型的開始。

自定義Home活動需要用戶進行身份驗證(輸入一些簡單的憑據)。 我的想法是從Home活動啟動一個子活動,並將意圖中的結果傳回Home活動。 我需要能夠捕獲有關這些憑據的信息,並且該信息將被傳遞回Home活動。 但是,嘗試這個時我遇到了問題。 我在LogCat中登錄了以下內容:“活動正在作為新任務啟動,因此取消了活動結果。”

我知道startActivityForResult方法,但這對我來說似乎沒有用。 這是我從家庭活動中啟動活動的地方:

@Override
protected void onResume() {
    super.onResume();
    bindRecents();

    Intent iii = new Intent(this, Login.class);
    startActivityForResult(iii, STATIC_LOGIN_INTEGER_VALUE);
}

當代碼執行時,我從ActivityManager標記中獲取上述日志。

我的登錄活動有一個用戶輸入憑據后將會點擊的按鈕。 如果憑據是好的,那么我嘗試執行以下操作(我輸入了幾個日志,以便我可以嘗試弄清楚發生了什么):

public void onClick(View src) {
    // check for authentic credentials
    if(IsValid())
    {
        Intent loginAuth = new Intent("Login");
        loginAuth.putExtra("userRole", userRole);

        Log.d("LOGIN", "Setting result...");
        if (getParent() == null) {
            Log.d("LOGIN", "Parent was null");
            setResult(Activity.RESULT_OK, loginAuth);
        }
        else {
            Log.d("LOGIN", "setting result on parent...");
            getParent().setResult(Activity.RESULT_OK, loginAuth);
        }

        Log.d("LOGIN", "Finishing the activity");
        finish();
    }
}

我在清單文件中將這些活動定義如下:

    <activity android:name="Home"
            android:theme="@style/Theme"
            android:launchMode="singleInstance"
            android:stateNotNeeded="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.HOME"/>
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity android:name="Login"
              android:label="Login"
              android:launchMode="singleInstance">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.HOME" />
        </intent-filter>
    </activity>

我正在使用Login活動上的intent過濾器。 我最初把它設置為空。 我也有launchMode空白(默認為標准我相信)。 我已經玩了大部分這些選項,似乎沒有任何改變事實,即ActivityManager似乎想要將活動作為一個新任務啟動,並想要忽略返回的意圖(我需要)。

問題是您使用launchMode =“singleInstance”聲明了您的活動,因此Android在啟動Login活動時會創建一個新任務(即新進程)。 不同任務中的活動不能相互返回結果。 從Activity.startActivityForResult()docs:

例如,如果要啟動的活動使用singleTask啟動模式,則它將不會在您的任務中運行,因此您將立即收到取消結果。

singleInstance就像singleTask,但更具限制性。 嘗試從清單中刪除launchMode屬性,以便Login活動將在同一任務中啟動,然后在需要在單獨任務中啟動其他活動時使用FLAG_ACTIVITY_NEW_TASK。

巴里

文件說

例如,如果要啟動的活動使用singleTask啟動模式,則它將不會在您的任務中運行,因此您將立即收到取消結果。

這是錯的

你可以使用singleTask就好了,你不能使用的是singleInstance

讓我們回到這個問題。 問題是什么?

問題是當你在一個活動上調用startActivityForResult()時,調用者活動和你正在啟動的活動必須在同一個任務上才能使startActivityForResult()正常工作,這意味着你不能將startActivityForResult()調用到使用Intent.FLAG_ACTIVITY_NEW_TASK的活動。

為什么singleInstance不工作?

因為“singleInstance”活動是其任務中唯一的活動。 如果它啟動另一個活動,則無論其啟動模式如何,該活動都將啟動到另一個任務 - 就像FLAG_ACTIVITY_NEW_TASK在意圖中一樣。 在所有其他方面,“singleInstance”模式與“singleTask”相同。

為什么singleTask正在運行?

因為singleTask不需要為正在啟動的新活動創建新任務。

在此輸入圖像描述

我引用這個答案來解釋兩種發射模式之間的區別。

您是否在Login活動中聲明了setResult(int resultCode, Intent data) Android文檔說“請注意,此方法只應與定義為返回結果的Intent協議一起使用。” 如果它不是或某些其他條件與Activity.startActivityForResult()的文檔中匹配,它將不會在您的任務中運行,因此您將立即收到取消結果。“

暫無
暫無

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

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