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());
}
どうもありがとう !