2***@qq.com
2***@qq.com
  • 发布:2019-06-18 10:14
  • 更新:2023-04-15 21:33
  • 阅读:3011

android 插件开发,插件类 打开 activity ,然后接收 activity 返回值 onActivityResult

分类:5+ SDK

也是郁闷了好些天才搞定

场景:如题,activity (页面)操作后返回数据到,插件类里面。
不说了,直接上代码:
插件类:

package com.example.chajian;  

import android.content.Intent;  
import android.util.Log;  

import org.json.JSONArray;  

import io.dcloud.common.DHInterface.IApp;  
import io.dcloud.common.DHInterface.ISysEventListener;  
import io.dcloud.common.DHInterface.IWebview;  
import io.dcloud.common.DHInterface.StandardFeature;  
import io.dcloud.common.util.JSUtil;  

public class Ceshi extends StandardFeature {  

    public void Test(IWebview pWebview, JSONArray array) {  

        final IWebview iWebview = pWebview;  
        final String CallBackID = array.optString(0);  
        final JSONArray newArray = new JSONArray();  

        newArray.put(array.optString(1));  
        newArray.put(array.optString(2));  
        newArray.put(array.optString(3));  
        newArray.put(array.optString(4));  

         //添加监听  
        final IApp _app = pWebview.obtainFrameView().obtainApp();  
        _app.registerSysEventListener(new ISysEventListener() {  
            @Override  
            public boolean onExecute(SysEventType pEventType, Object pArgs) {  

                Object[] _args = (Object[]) pArgs;  
                int requestCode = (Integer) _args[0];  
                int resultCode = (Integer) _args[1];  

                Intent data = (Intent) _args[2];  

                //[Ljava.lang.Object;@e89a7c8  
                Log.d("aaa", "onExecute: _args " + _args);  
                //1  
                Log.d("aaa", "onExecute: requestCode " + requestCode);  
                //-1  
                Log.d("aaa", "onExecute: resultCode " + resultCode);  
                //Intent { (has extras) }  
                Log.d("aaa", "onExecute: data " + data);  

                if (pEventType == SysEventType.onActivityResult) {  
                    //用完给取消注册监听  
                    _app.unregisterSysEventListener(this, SysEventType.onActivityResult);  

                    //判断请求码  
                    if (requestCode == 1) {  
                        //获取返回值  
                        String returnData = data.getStringExtra("return_data");  
                        //执行 js 回调  
                        JSUtil.execCallback(iWebview, CallBackID, returnData, JSUtil.OK, false);  
                        Log.d("aaa", "返回的数据为:" + returnData);  
                    }  
                }  
                return false;  
            }  
        }, SysEventType.onActivityResult);  

        //打开 activity  
        Intent openItent = new Intent(pWebview.getActivity(), Open.class);  
//        Intent openItent = new Intent(pWebview.getContext(),Open.class);  
        pWebview.getActivity().startActivityForResult(openItent, 1);  
    }  

}  

activity 类:

package com.example.chajian;  

import android.content.Intent;  
import android.os.Bundle;  
import android.support.v7.app.AppCompatActivity;  
import android.util.Log;  
import android.view.View;  
import android.widget.Button;  

public class Open extends AppCompatActivity {  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.open_activity);  

        Button open = findViewById(R.id.open);  

        open.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View view) {  
                Log.d("aaa", "Open.onCreate : open");  

                Intent intent = new Intent();  
                intent.putExtra("return_data","我去它妹的!");  
                setResult(RESULT_OK,intent);  

                finish();  
            }  
        });  
    }  

}  

代码并不复杂,一行一行的看,很好理解,还有注释。
逻辑是,插件类设置事件监听-打开 activity-activity 设置返回值后 finish() (关闭)-插件类监听到返回值处理执行 js 回调。

0 关注 分享

要回复文章请先登录注册

note744917

note744917

请教一下,findViewById(R.id.open);这一句,这个id : open , 不应该应该是在layout的xml中定义吗,没看见你代码中写xml? 请赐教
2023-04-15 21:33
4***@qq.com

4***@qq.com

回复 2***@qq.com :
就是新页面刚打开,就执行这个方法了,就把数据返回了, 而不是在关闭页面setResult(RESULT_OK,intent)的时候返回数据。
2020-03-04 20:49
4***@qq.com

4***@qq.com

回复 2***@qq.com :
代码是复制你的。第一次打开新页面正常,第二次刚点,页面还没打开, Log.d("aaa", "返回的数据为:" + returnData); 数据就返回了,返回的是上次的。
2020-02-27 23:35
2***@qq.com

2***@qq.com (作者)

回复 4***@qq.com :
不知道你的逻辑是啥样的,你可以这样试试,把目标 activity 页 里的 setResult(RESULT_OK,intent); ,RESULT_OK,这个可以设置自定义值,你设置一个别的,比如 999 及以上的试试,然后再插件的类的 SysEventType.onActivityResult 方法中去判断这个返回值。
2020-02-26 09:16
4***@qq.com

4***@qq.com

第一次是正常的,但是第二次调用这个方法,刚进入页面,SysEventType.onActivityResult 这个方法就执行了,再次返回,这个方法就不执行了,导致每次返回的数据都是第一次的数据,这个怎么处理
2020-02-22 00:32