一 .提供scheme链接在第三方应用Activity中唤醒
- 在自己app中的AndroidManifest.xml文件里包含<action android:name="android.intent.action.MAIN" />的activity标签中添加一个新的intent-filter标签 ,注意data标签里的scheme、host属性,代码如下
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="main.app" android:scheme="sysc"/><!-- 访问链接sysc://main.app?cid=参数 --> </intent-filter> </activity>
- 在第三方应用内部就可以用如下方式调用了
String url = "sysc://main.app?key=传递的参数" Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(in);
- 然后在我们的MainActivity中通过如下代码获得参数并做相应处理
//获取其他应用唤醒该app传过来的参数 Intent intent = getIntent(); String scheme = intent.getScheme(); Uri uri = intent.getData(); if (uri != null) { //获得参数值 cid = uri.getQueryParameter("cid"); } Log.d(TAG,"scheme="+scheme+",cid="+cid);
二 .提供链接在第三方应用webview页面中唤醒
在Android的webview中本是不支持直接打开本地应用的,所以我们就要自己来处理, 通过在重定向的时候判断是否是普通的网页链接,如果不是则为scheme调用的这种,则我们自己来处理为意图(intent)进行跳转.
具体操作: 在第三方应用的Activity中新建webview并重写其父类的shouldOverrideUrlLoading方法:
public class MainActivity extends AppCompatActivity{
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebViewClient webViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(final WebView view, String url) {
if (url.startsWith("http") || url.startsWith("https")) { //http和https协议开头的执行正常的流程
return false;
} else { //其他的URL则会开启一个Acitity然后去调用原生APP
Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
if (in.resolveActivity(getPackageManager()) == null) {
//说明系统中不存在这个activity
view.post(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage("应用未安装,是否前往下载页面?");
builder.setTitle("提示");
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
view.loadUrl("https://www.baidu.com");//此处应改为我们app的下载地址
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
});
} else {
in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(in);
}
return true;
}
}
};
webView = findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(webViewClient);
webView.loadUrl("file:///android_asset/new_file.html"); //包含跳转链接的html页面
}
}
布局文件如下
Html页面如下
Html在android项目中的路径
在我们的app中通过如下代码获得参数并做相应处理
@Override
protected void onCreate(Bundle savedInstanceState) {
//获取其他应用唤醒该app传过来的参数
Intent intent = getIntent();
String scheme = intent.getScheme();
Uri uri = intent.getData();
if (uri != null) {
//获得参数值
cid = uri.getQueryParameter("cid");
}
Log.d(TAG,"scheme="+scheme+",cid="+cid);
if (!cid.equals("") && "sysc".equals(scheme)){
//此处编写处理跳转请求的逻辑
}
}