2

2つのアプリケーションがあります。最初の A には、別のアプリケーションへのリンクとタイムスタンプを含む Web ビューがあります。この Web ビューには、別のアプリケーション B を開くリンクがあります。B にはボタンがあります。ボタンをクリックすると、再読み込みせずにアプリ A に戻り、Web ビューの他のフィールドに入力する JavaScript コードを実行する必要があります。その結果、アプリ A を元に戻す必要があります。タイムスタンプは変更せず、javascript を呼び出し、フィールドに適切にデータを入力します。

問題は、このシナリオを実行し、StartActivity() のみを使用して A からアプリ B を開始すると、機能しないことです。AB と BA を実行できますが、A が適切な意図で呼び出されないため、JavaScript が呼び出されません。言い換えれば、B から A を呼び出すとき、A に移動したアクションとデータをインテント オブジェクトで見つける必要がありますが、インテント内のアクションは NULL です。

一方、B でアクティビティを開始するときにフラグを追加する場合: FLAG_ACTIVITY_NEW_TASK. 1回で動作します。A->B->A ですが、その後 B を再度呼び出すことはできません。私が行った別のテスト: ホーム画面から B を呼び出し、A よりも B よりも呼び出しを開始すると、動作します。したがって、Aまたはホーム画面からインテントを使用して呼び出された場合、Bが異なるという事実に関係していると思います。

とにかく、アプリを開いてjsを呼び出し、コンテキストをすべて同時に保持することはできませんでした。

エミュレーターでのみ試しました。

アプリ A のマニフェストは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.cgi.csb.launcher"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="12"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:name=".Activity1" launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:host="localhost" android:scheme="myactivity"></data>
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリ B のマニフェストは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.CallerApp"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="12"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <application android:label="@string/app_name">
        <activity android:name=".Activity2" launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>

            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data
                        android:host="dummy"
                        android:scheme="testintentapp"/>
            </intent-filter>
        </activity>

    </application>
</manifest>

A から B を呼び出すには:

@Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                intent.addCategory("android.intent.category.DEFAULT");
                startActivity(intent);

                return true;
            }

B から A を呼び出すには:

case R.id.button:
                   Intent intent = new Intent();
                   intent.setData(Uri.parse("myactivity://localhost"));
                   intent.putExtra("firstKeyName","FirstKeyValue");
                   intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
                   intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                   intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                   startActivity(intent);
                   finish();
                   break;

A がホームから呼び出されたとき、またはアプリ B から呼び出されて JavaScript を呼び出すときを区別するために使用するコード

    Intent intent = getIntent();

    if ("myactivity://localhost".equals(intent.getDataString())) {
        Log.d(TAG, "*** Call JS with action : " + intent.getAction());
        _jsHandler.javaFnCall("Hardcoded params");
    } else {
        Log.d(TAG, "***Just call the app with action :" + intent.getAction());
    }

どうもありがとう !

4

0 に答える 0