2

私はAndroidプログラミングに比較的慣れていません。仕事で、カスタム ホーム アクティビティ ランチャーを作成する必要があるタスクを与えられました。少し調べてみたところ、Android 開発者の Web サイト ( home sample ) で例を見つけました。これが私のプロトタイプの始まりでした。

カスタム ホーム アクティビティでは、ユーザーに認証を要求する必要があります (いくつかの簡単な資格情報を入力します)。私が考えたのは、ホーム アクティビティからサブ アクティビティを起動し、インテントの結果をホーム アクティビティに戻すことでした。これらの資格情報に関する情報をキャプチャできるようにする必要があり、その情報は Home アクティビティに戻される予定でした。ただし、これを試すと問題が発生します。LogCat に、「アクティビティが新しいタスクとして起動されているため、アクティビティ結果をキャンセルしています」というログが表示されます。

startActivityForResult メソッドについては認識していますが、うまく機能していないようです。ここで、ホーム アクティビティからアクティビティを起動します。

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

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

そのコードが実行されると、ActivityManager タグから上記のログを取得します。

My Login アクティビティには、ユーザーが資格情報を入力した後に押すボタンがあります。資格情報に問題がなければ、次のことを試みます (何が起こっているのかを把握できるように、いくつかのログを記録します)。

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 アクティビティのインテント フィルターをいじっていました。私はもともとそれを何も設定していませんでした。また、launchMode を空白にしました (これはデフォルトで標準になっていると思います)。私はこれらのオプションのほとんどをいじってみましたが、ActivityManager が新しいタスクとしてアクティビティを起動しようとしているようで、返されたインテント (私が必要とする) を無視したいという事実を変えるものは何もないようです。

4

3 に答える 3

10

問題は、launchMode="singleInstance" でアクティビティを宣言したため、ログイン アクティビティを起動するときに Android が新しいタスク (つまり、新しいプロセス) を作成することです。異なるタスクのアクティビティは、相互に結果を返すことはできません。Activity.startActivityForResult() ドキュメントから:

たとえば、起動しようとしているアクティビティが singleTask 起動モードを使用している場合、そのアクティビティはタスクで実行されないため、すぐにキャンセル結果が返されます。

singleInstance は singleTask に似ていますが、さらに制限があります。Login アクティビティが同じタスクで起動されるようにマニフェストから launchMode 属性を削除してから、別のタスクで別のアクティビティを起動する必要がある場合は FLAG_ACTIVITY_NEW_TASK を使用してください。

バリー

于 2011-06-21T16:02:11.357 に答える
0

setResult(int resultCode, Intent data)Login アクティビティでを宣言しましたか。Android ドキュメントには、「このメソッドは、結果を返すように定義されたインテント プロトコルでのみ使用する必要があることに注意してください」と記載されています。そうでない場合、または のドキュメントのように他の条件が一致するActivity.startActivityForResult()場合、タスクは実行されないため、すぐにキャンセル結果が返されます。」

于 2011-06-21T16:01:39.253 に答える