急いでいる学生は、このコードを読むだけで、残りは読まないでください。
var main = plus.android.runtimeMainActivity(); var Intent= plus.android.importClass("android.content.Intent") intent.setComponent(new ComponentName("应用包名","应用包名.activity类名")); intent.putExtra("type", 1); main.startActivityForResult(intent, 0);
1.ユニアプリはAndroidネイティブインターフェース(アクティビティ)にジャンプし、値を転送します
- フロントエンド値転送操作
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<input type="button" value="js start native Activity" onclick="jsCallNativeActivity()"/>
</body>
<script type="text/javascript">
function jsCallNativeActivity(){
//获取宿主上下文
var main = plus.android.runtimeMainActivity();
//通过反射获取Android的Intent对象
var Intent = plus.android.importClass("android.content.Intent");
//通过宿主上下文创建 intent
var intent = new Intent(main.getIntent());
//设置要开启的Activity包类路径 com.HBuilder.integrate.MainActivity换掉你自己的界面
intent.setClassName(main, "com.HBuilder.integrate.MainActivity");
//开启新的任务栈 (跨进程)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//向原生界面传值操作
intent.putExtra("uni_key","来自uniapp的值");
//开启新的界面
main.startActivity(intent);
}
</script>
</html>
Androidを使用するすべての人は、intent.putExtra(key、value)がIntentを介して異なるコンポーネント間で値操作を渡すことであることを知っています。フロントエンド開発者の場合、値intent.putExtra( "uni_json_key"を渡すためにそれをjsonに直接カプセル化することをお勧めします、 "{key、" value1 "}");
- Android側は値を受け取ります
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent mIntent = getIntent();
if (mIntent!=null){
//获取Intent,通过key获取对应的值
String uniValue = mIntent.getStringExtra("uni_key");
Toast.makeText(this, "uniValue="+uniValue, Toast.LENGTH_SHORT).show();
}
}
}
効果は次のとおりです。
2.ユニアプリはAndroidネイティブインターフェース(アクティビティ)にジャンプして値を渡し、戻り値とともにユニアプリを返します
- uni-appはAndroidネイティブインターフェースを開き、戻り値を要求します
function jsCallNativeActivity(){
//获取宿主上下文
var main = plus.android.runtimeMainActivity();
//通过反射获取Android的Intent对象
var Intent = plus.android.importClass("android.content.Intent");
//通过宿主上下文创建 intent
var intent = new Intent(main.getIntent());
//设置要开启的Activity包类路径 com.HBuilder.integrate.MainActivity换掉你自己的界面
intent.setClassName(main, "com.HBuilder.integrate.MainActivity");
//开启新的任务栈 (跨进程)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//uni向android原生界面传值
intent.putExtra("uni_key","来自uniapp的值");
//请求码保证了,开始的新界面和返回的是同一个操作
var CODE_REQUEST=1000
//采用startActivityForResult开启新的界面,当界面关闭时可以处理返回结果, CODE_REQUEST请求码是唯一标识
main.startActivityForResult(intent,CODE_REQUEST);
//设置原生界面返回后的回调操作
main.onActivityResult = function(requestCode, resultCode, data) {
if (requestCode == CODE_REQUEST) {
alert(requestCode); //这个是正确的 1000
alert(resultCode); //始终都是0
alert(data); //弹出 undefined
}
}
}
- Android側のボタンをクリックして、ネイティブインターフェイスを閉じ、値を返します
public void backValue(View view) {
Intent mIntent = new Intent();
mIntent.putExtra("Native_RESULT_Key", "来自原生界面的返回值");
setResult(Activity.RESULT_OK, mIntent);
finish();
}
上記の操作の後、理論的には値を返すことができるはずですが、実際には、正しいrequestCodeを除いて、他の値はすべて間違っています。なぜですか?Androidの公式デモソースコードをたどったところ、バグがあることがわかりました。新しいインターフェースを開いたときにonActivityResultメソッドが実際に呼び出され、戻ったときにsetResult(Activity.RESULT_OK、mIntent)が呼び出されましたが、onActivityResultはまったく離れませんでした。このように、resultCodeとデータは正常に割り当てられません。下のログに示すように
、オフィシャルがここに穴を掘ったことがわかります。何人の人がそこに飛び込んだのですか。彼のライフサイクルメソッドが乱雑と呼ばれるのはなぜですか。ユニアプリのデモはこのように記述されており、プロキシクラスを使用してすべてのイベント操作を処理します
Androidの公式ソースコードのみを確認できます。
つまり、ネイティブアクティビティを開始してインタラクションを再開すると、onResume()の前にonActivityResultが呼び出され、前のインターフェースの値が返されます。onActivityResultは実行されず、そのuni-appはいくつかの場所で何かを行っています。メソッドがインターセプトされ、Androidライフサイクルメソッドのコールバックで例外が発生します。そのため、Androidライフサイクルをまっすぐにするために、この問題をuni-appで処理する必要があります。
私の個人的な解決策は、次のように、EventBusを使用してSDK_WebAppのonActivityResultを手動で呼び出すことです。
1.App.gradleの依存関係2.DataSynEventをimplementation 'org.greenrobot:eventbus:3.0.0'
作成します
public class DataSynEvent {
public int requestCode;
public int resultCode;
public Intent data;
public DataSynEvent(int requestCode, int resultCode, Intent data) {
this.requestCode = requestCode;
this.resultCode = resultCode;
this.data = data;
}
}
3.SDK_WebApp.javaを変更します
public class SDK_WebApp extends Activity implements IActivityDelegate {
private static final String TAG = "SDK_WebApp";
....
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
//注册EventBus
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
mEntryProxy.onStop(this);
//解绑EventBus
EventBus.getDefault().unregister(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult: " + data + ",requestCode=" + requestCode + ",resultCode=" + resultCode);
super.onActivityResult(requestCode, resultCode, data);
if (data!=null){
//第一次启动的时候调用这个方法data肯定为null.所以减少调用次数
mEntryProxy.onActivityExecute(this, SysEventType.onActivityResult, new Object[]{requestCode, resultCode, data});
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onDataSynEvent(DataSynEvent event) {
Log.d(TAG, "onDataSynEvent: ");
//手动调用
onActivityResult(event.requestCode, event.resultCode, event.data);
}
}
4.ネイティブインターフェイスのreturnメソッドを変更します
public void backValue(View view) {
Intent data= new Intent();
data.putExtra("Native_RESULT_Key", "来自原生界面的返回值");
//用EventBus替换setResult(Activity.RESULT_OK,data);
EventBus.getDefault().post(new DataSynEvent(1000,Activity.RESULT_OK,data));
finish();
}
5.フロントエンドの受信方法を変更します
function jsCallNativeActivity(){
//获取宿主上下文
var main = plus.android.runtimeMainActivity();
//通过反射获取Android的Intent对象
var Intent = plus.android.importClass("android.content.Intent");
//通过宿主上下文创建 intent
var intent = new Intent(main.getIntent());
//设置要开启的Activity包类路径 com.HBuilder.integrate.MainActivity换掉你自己的界面
intent.setClassName(main, "com.HBuilder.integrate.MainActivity");
//uni向android原生界面传值
intent.putExtra("uni_key","来自uniapp的值");
//开启新的任务栈 (跨进程)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//请求码保证了,开始的新界面和返回的是同一个操作
var CODE_REQUEST=1000
//采用startActivityForResult开启新的界面,当界面关闭时可以处理返回结果, CODE_REQUEST请求码是唯一标识
main.startActivityForResult(intent,CODE_REQUEST);
//设置原生界面返回后的回调操作
main.onActivityResult = function(requestCode, resultCode, data) {
if (requestCode == CODE_REQUEST) {
alert(requestCode); //这个是正确的 1000
alert(resultCode); //这个是正确的 -1
alert(data.getStringExtra("Native_RESULT_Key")); //弹出 来自原生界面的返回值
}
}
}
6.上記の効果
公式フォーラムの誰かが尋ねた見て*main
それが何であるかは、それが実際に反射して得られたホストのアクティビティのインスタンスオブジェクトでありますcom.HBuilder.integrate.SDK_WebApp
*
2020年5月12日の補足
通信に関しては、uni-appは、2020年4月末にアプレットにイベントを送信するために、関連するapiホストアプリを正式に提供しました
- AndroidプラットフォームAPI
DCUniMPSDK.getInstance().sendUniMPEvent(event, data)
- パラメータの説明
パラメータ | の種類 | 必須 | 説明 |
---|---|---|---|
イベント | ストリング | はい | イベントをトリガーしたイベント |
データ | 文字列またはJSON | はい | イベントによって運ばれるパラメータ |
- 戻り値
の種類 | 説明 |
---|---|
ブール値 | trueは、イベント通知が成功したことを示します。falseは失敗を意味します。ログで確認できます。 |