打开Activity的两种方式
打开Activity的方式基本可以分为两大类,显示打开和隐式打开。
显示启动
Intent intent = new Intent(); intent.setClassName(getPackageName(), getPackageName() + ".SecondActivity"); startActivity(intent);
隐式启动
//Androidmanifest.xml里面相关配置 <activity android:name="com.ccg.demo.SecondActivity" android:label="第二个Activity" > <intent-filter> <action android:name="android.intent.action.startSecondActivity" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Intent intent = new Intent(); intent.setAction("android.intent.action.startSecondActivity"); intent.addCategory(Intent.CATEGORY_DEFAULT); startActivity(intent); ```
通过Scheme打开Activity
第二种隐式启动的方式不用明确指定对应的参数,因此如果我们想要通用H5来打开native的界面,就可以利用这种方式。步骤如下:
- 1)、如在上面的Activity的配置里面,增加多下面配置
> <intent-filter>
> <action android:name="android.intent.action.startSecondActivity" />
> <category android:name="android.intent.category.DEFAULT" />
> <data
> android:scheme="schemetest"
> android:host="host1"
> android:path="/path"
> android:port="8080" />
> </intent-filter>
- 2)、执行对应的scheme
<!DOCTYPE html>
<html>
<body>
<h1>Scheme Demo</h1>
<a href="schemetest://host1:8080/path1">Click</a>
</body>
</html>
如上,WEB端就可以通过调用“schemetest://host1:8080/path1“来打开这个SecondActivity。注意,scheme和host 这两个在使用的时候是必须配置的,其他的可以随意。
实现原理
如果我们不设置webviewclient,在webview执行上面跳转的时候,会交给系统处理,因为系统拥有每个应用的Androidmanifest.xml文件,在执行以上scheme的时候,系统就会主动去寻找是否存在匹配的activity,如果存在的话,就会执行打开操作。但我们一般在使用webview 的时候,都会设置webviewclient,因此希望这scheme能够正常响应的话,需要我们在shouldOverrideUrlLoading方法里面执行判断处理,
wv.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
String scheme = Uri.parse(url).getScheme();
if (TextUtils.equals("schemetest", scheme)) {
Uri uri=Uri.parse(url);
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
return true;
}
return false;
}
});