react native 调用android activity

来源:互联网 发布:唐嫣香港知乎 编辑:程序博客网 时间:2024/05/21 06:34

1.react native 调用原生必须继承一个SimpleViewManager 

  1.但是SimpleViewManager 需要View的子类才能继承 而我们activity最终继承的是Context,接下来我就需要获取activity的view
  2.首先在外部获取activity的View 众所周知我们要获取某个class 有两种方法一个是直接new,一个是通过反射获取。但是这两者都行不通的
  3.查看android系统底层源码你会发现LocalActivityManger通过startActivity(String id,Intent intent),可以与指定的activity绑定,并且返回一个             window,LocalActivityManager 可以同时管理多个activity
   4.首先我们拿到LocalActivityManger对象,然后再从获取DecorView
    补充下DecorView是整个ViewTree的最顶层View,它是一个FrameLayout布局,代表了整个应用的界面。在该布局下面,有标题view和内容view这两个子    元素(不懂得可以看底层
View源码解读

     mActivityManager = new LocalActivityManager(this, true);
     mActivityManager .dispatchCreate(savedInstanceState);
     View view = mActivityManager.startActivity("", new Intent(this, TrendTwoActivity.class)).getDecorView();
  5.上面的这样就结束了,想多了这样还是会报错的
  6.获取activity的view必须要到activity onPause和onResume 进行配置两个方法
  mActivityManager.dispatchPause(isFinishing());和mActivityManager.dispatchResume();
  这样就可以拿到了activity中的view
  有人会问了SimpleViewManager没有onPause和onResume两个生命周期方法,对确实没有,
  理解react native的启动机制的就知道react native 启动都是依赖原生的activity来启动的,我们可以到
  MainActivity中去拿到View再进行存储,根据原生UI组件再获取进行返回,(原生ui组件的不会去看react native官网或者搜索网上,有很多资料)
 ok完美解决,现在我们贴出源码给大家参考下
public class MainActivity extends ReactActivity  {    @Override    protected String getMainComponentName() {        return "xxx";    }    LocalActivityManager mActivityManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //获取走势的view        if( MainApplication.trendView==null) {            mActivityManager = new LocalActivityManager(this, true);            mActivityManager.dispatchCreate(savedInstanceState);            View view = mActivityManager.startActivity("", new Intent(this, TrendTwoActivity.class)).getDecorView();            MainApplication.trendView = view;        }    }    @Override    protected void onPause() {        super.onPause();        mActivityManager.dispatchPause(isFinishing());    }    @Override    protected void onResume() {        super.onResume();        mActivityManager.dispatchResume();    }
/** * Created by kim * on 2017/10/24 0024. */public class TrendView extends SimpleViewManager<View> {    @Override    public void onCatalystInstanceDestroy() {        super.onCatalystInstanceDestroy();    }    @Override    public String getName() {        return "TrendView";    }    @Override    protected View createViewInstance(ThemedReactContext reactContext) {        Log.d("view___",MainApplication.trendView+"");        return MainApplication.trendView;    }}


 
 








  

原创粉丝点击