[英]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”活動是其任務中唯一的活動。 如果它啟動另一個活動,則無論其啟動模式如何,該活動都將啟動到另一個任務 - 就像FLAG_ACTIVITY_NEW_TASK在意圖中一樣。 在所有其他方面,“singleInstance”模式與“singleTask”相同。
因為singleTask不需要為正在啟動的新活動創建新任務。
我引用這個答案來解釋兩種發射模式之間的區別。
您是否在Login活動中聲明了setResult(int resultCode, Intent data)
。 Android文檔說“請注意,此方法只應與定義為返回結果的Intent協議一起使用。” 如果它不是或某些其他條件與Activity.startActivityForResult()
的文檔中匹配,它將不會在您的任務中運行,因此您將立即收到取消結果。“
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.