摘要:如下新建一個類,來存放我們需要被調(diào)用的代碼緊接著我們需要新建一個類繼承自這個抽象類,之后我們新建的這個類,可以承載我們暴露給的方法。新建一個包,如圖圖在包下,新建一個類,如圖圖代碼如下這里有幾個事項,注意一下我們繼承自這個抽象類。
歡迎大家收看react-native-android系列教程,跟著本系列教程學(xué)習(xí),可以熟練掌握react-native-android的開發(fā),你值得擁有:
https://segmentfault.com/blog...
書接上節(jié),我們上節(jié)說道,如何控制原生android的activity間跳轉(zhuǎn),這次,我們試著用js去操控這個過程。
1. 為你的應(yīng)用添加一個js可調(diào)用的java接口既然要使用js去調(diào)用java,那我們的第一步,當(dāng)然是提供一個js可以調(diào)用的java接口了。
1.1?提供一個跳轉(zhuǎn)的函數(shù)首先,照著上節(jié)的思路,我們將activity之間的跳轉(zhuǎn),封裝成一個函數(shù),放在MainActivity里面。如下:
public class MainActivity extends ReactActivity { public void skip() { Intent intent = new Intent(this, DetailActivity.class); startActivity(intent); } .... }1.2 新建一個類,來存放我們需要被調(diào)用的java代碼
緊接著我們需要新建一個類(MyExtension)繼承自ReactContextBaseJavaModule這個抽象類,之后我們新建的這個類,可以承載我們暴露給js的方法。讓我們動手開始寫這個類吧。
1.2.1 新建一個包---extension,如圖1.2.1
圖1.2.1
圖1.2.2
代碼如下:
package com.hellowreact.extension; import android.content.Intent; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.hellowreact.DetailActivity; import com.hellowreact.MainActivity; /** * Created by baidu on 16/6/12. */ public class MyExtension extends ReactContextBaseJavaModule { public MyExtension(ReactApplicationContext reactContext) { super(reactContext); } @ReactMethod public void open() { MainActivity activity = (MainActivity) getCurrentActivity(); activity.skip(); } @Override public String getName() { return "MyExtension"; } }
這里有幾個事項,注意一下:
1. 我們繼承自ReactContextBaseJavaModule這個抽象類。
2. 我們需要重寫getName方法,命名一下我們的擴(kuò)展。以后我們可以在js里面按照名字找到這個擴(kuò)展。
3. 我們寫了一個open方法,這個方法是未來會導(dǎo)出到我們的js中,并可以被js調(diào)用的方法。
1.3 書寫注冊接口待用我們寫好了方法,接著我們就要注冊了,我們還在extension的包里面,新建一個類(ExtensionPackage),代碼如下:
package com.hellowreact.extension; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Created by baidu on 16/6/12. */ public class ExtensionPackage implements ReactPackage { @Override public ListcreateNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList<>(); modules.add(new MyExtension(reactContext)); return modules; } @Override public List > createJSModules() { return Collections.emptyList(); } @Override public List createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } }
此時,我們的目錄結(jié)構(gòu)看起來應(yīng)該是這樣的,如圖1.3.1
圖1.3.1
接著,我們要在MainActivity中去注冊我們寫好的這個接口。
打開我們的MainActivity,其中有一個已經(jīng)寫好的方法 ---?getPackages,如圖1.4.1
圖1.4.1
我們在其中,加入我們寫好的接口(ExtensionPackage)
上述步驟完成之后,就意味著我們的接口已經(jīng)導(dǎo)出了,接下來我們首先要驗(yàn)證一下。我們打開index.android.js并在require的模塊中,增加一個NativeModules(如圖2.1)
圖2.1
NativeModules中存放著我們可以調(diào)用的native模塊,還記得當(dāng)時定義我們的擴(kuò)展時,起的名字是什么嗎?
圖2.2
對!就是"MyExtension",既然已經(jīng)注冊好了,那么我們就在js中看看,是否已經(jīng)有了呢?我們挑一個地方(本例中使用的是在constructor里)打印一下,看看是否已經(jīng)有了呢(如圖2.3)。
圖2.3
我們使用debug js,在chrome中調(diào)起調(diào)試界面(如果還不會使用,我們接下來的章節(jié)里會詳細(xì)講解,跟著我看看變量即可,如圖2.4):
圖2.4
可以看下圖2.5,我們成功的看到了當(dāng)時我們導(dǎo)出的open函數(shù):
圖2.5
good?。?!
3 嘗試調(diào)用我們導(dǎo)出的open方法上一步中,我們驚喜的看到我們在java中定義的open方法已經(jīng)能在控制臺看到了。接下來,我們在點(diǎn)擊list的時候,去調(diào)用一下open方法:
class hellowReact extends Component { constructor(props) { console.log(NativeModules.MyExtension); super(props); var list = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); this.state = { list: list.cloneWithRows(["hello", "react", "this", "is", "my", "listView"]) }; } oneRow(oneItem) { return{oneItem} ; } seeDetail() { NativeModules.MyExtension.open(); } render() { return (); } }
接著,我們重新運(yùn)行一下,效果如圖3.1與圖3.2
圖3.1
圖3.2
于是乎,我們看到了運(yùn)行的效果。下一章,我們會一起看看react-native中,js調(diào)用原生代碼的原理。
本文中所用的例子,可以在這里找到:
https://github.com/houyu01/re...
下一節(jié),我們將一起討論一下,上述調(diào)用的RN底層原理,非常淺顯易懂,不要錯過:
原創(chuàng)文章,版權(quán)所有,轉(zhuǎn)載請注明出處
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65022.html
摘要:如下新建一個類,來存放我們需要被調(diào)用的代碼緊接著我們需要新建一個類繼承自這個抽象類,之后我們新建的這個類,可以承載我們暴露給的方法。新建一個包,如圖圖在包下,新建一個類,如圖圖代碼如下這里有幾個事項,注意一下我們繼承自這個抽象類。 歡迎大家收看react-native-android系列教程,跟著本系列教程學(xué)習(xí),可以熟練掌握react-native-android的開發(fā),你值得擁有: ...
摘要:個人感覺這與中的布局文件類似。其中的會被解析。中的標(biāo)簽,由基礎(chǔ)庫提供。認(rèn)為,我們的程序是一個狀態(tài)機(jī)。支持我們更改狀態(tài),從而引起視圖的變化。綁定事件是放在中的。事件名稱直接寫為標(biāo)簽的屬性,其值則是對應(yīng)的事件處理函數(shù)。 這一系列課程說了很多關(guān)于react-native的知識,都是有關(guān)于樣式,底層,環(huán)境等知識的,現(xiàn)在我們來學(xué)習(xí)一下reactjs的基礎(chǔ)知識。我們的代碼,我們創(chuàng)建的組件的相關(guān)知識...
閱讀 2765·2023-04-25 14:15
閱讀 2708·2021-11-04 16:11
閱讀 3399·2021-10-14 09:42
閱讀 448·2019-08-30 15:52
閱讀 2830·2019-08-30 14:03
閱讀 3550·2019-08-30 13:00
閱讀 2117·2019-08-26 11:40
閱讀 3312·2019-08-26 10:25