0

既存のアプリケーションがあります。ここで、いくつかの追加機能を追加したいと思います。追加機能にはいくつかのライブラリが必要です。アプリでライブラリを使用すると、アプリケーションのサイズが大きくなります。したがって、この追加機能を別のアプリで作成し、新しいアプリを既存のアプリに統合したいと考えています (既存のアプリの更新がある場合は、アプリ全体をダウンロードする必要がありますが、これは望ましくありません)。両方を 1 つの APK に入れたくありません。どちらもスタンドアロンである必要があります。最初のアプリケーション A から、新しいアプリケーション B でアクティビティを呼び出したいとします。intent.setComponent() を使用し、アプリケーション B のアクティビティは A から呼び出されますが、最初のアプリケーションでアプリケーション B から結果を取得できません。 .

アプリケーションA

public void onClickBtnToApplicationB(View v) {
    try {
        final Intent intent = new Intent(Intent.ACTION_MAIN, null);
        final ComponentName cn = new ComponentName("pakacagename","package.class");
        intent.setComponent(cn);
        intent.setAction(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                 
        startActivityForResult(intent, REQUEST_CODE);
    } catch (ActivityNotFoundException e) {
    //handle Exception
    } 
}

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    switch (requestCode) {
        case REQUEST_CODE:
           handleResult(resultCode, intent);
           break;
    }
}

public void handleResult(int resultCode, Intent intentResult) {
    switch (resultCode) {
        case RESULT_OK:
            String Result = intentResult.getStringExtra("RESULT");
            // I need Results from Application B here..
            break;

         case RESULT_CANCELED:
            break;
    }
  }

アプリケーション B: アプリケーション B では、クラス 1 が Result 2.class の別のアクティビティを開始し、結果を取得します。結果が受信された後、処理結果メソッド'a putextras' の最初のアプリケーションに送り返されます。したがって、取得できなかったアプリケーション A の handlerresult メソッドで結果を取得する必要があります。

Intent s = new Intent(1.this,2.class);
startActivityForResult(s, REQUEST_CODE_B);
protected void onActivityResult(int requestCode, int resultCode, Intent intentResult) {     
    switch(requestCode){
        case REQUEST_CODE_B:
            handleResult(resultCode, intentResult);
    }
}

public void handleResult(int resultCode, Intent intentResult) {
    switch (resultCode) {
    case RESULT_OK:
        String scanResult = intentResult.getStringExtra("RESULT");
        Intent newintent = new Intent();
        newintent.putExtra("RESULT", scanResult);
        setResult(Activity.RESULT_OK, newintent);
        finish();
        break;

    case RESULT_CANCELED:
        break;
}
4

2 に答える 2

0

現在のインテントから新しいインテントにデータを渡す必要がある 2 つのインテント設計では、次のようなことができます。

Intent i = new Intent(yourcurrentactivity.this, yournewactivity.class);
                    // following line is an example of passing data to the new intent.
        i.putExtra(getString(R.string.str_selecteddialog), "1");
        startActivity(i);
        this.finish();

onCreate で開始した新しいインテントでは、バンドルからデータを取得する必要があります。

Bundle extras = getIntent().getExtras();
    if (extras != null) {
        // Log.i(TAG, " 022:... we got some extras");
        str_selecteddialog = getIntent().getStringExtra(getString(R.string.str_selecteddialog));

明らかに、このタイプのコードを両方のインテントに入れ、アクティビティ名を逆にする必要があります。また、try コマンドを使用して、エクストラが評価されない問題をキャッチします。その条件は最初から存在しなければなりません。

変数のタイプに応じて、さまざまなタイプの put および get 'Extras' があります。混乱を避けるために、1 つの変数セット (Name Value Pairs、つまり Extras) を使用してインテント B に渡し、別のセットを使用してインテント B からインテント A に渡します。

さらに、一度に実行するそれぞれのインスタンスを 1 つだけにしたい場合、これは 2 つの方法で実現できます。上記の各アクティビティ内のマニフェストで、次を指定できます。

android:launchMode="singleTop"

または、他のインテントを開始する直前に、これを startActivity の前に置きます。

Intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

これらのいずれかまたは両方が、それぞれの倍数ではなく、各インテントを 1 つだけスタックに保持します。

さらに、現在のインテントを再起動する場合は、現在のインテントの再起動を参照してください。

お役に立てれば。

于 2013-07-31T04:39:34.037 に答える