天天看點

react native 調用android activity

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;
    }
}