一、显式调用方法
1.方法一
Intent intent=new Intent(本类,将要跳转的类);
startActivity(intent);
见Intent.class 源码:
----------------------------------------------------------------------------------------------------------------------------------public Intent(Context packageContext, Class<?> cls) {
mComponent = new ComponentName(packageContext, cls);
}
----------------------------------------------------------------------------------------------------------------------------------
2.方法二
Intent intent2=new Intent();
intent2.setClass(本类,将要跳转的类);
startActivity(intent2);
见Intent.class 源码:
------------------------------------------------------------------------------------------------------------------------------------
public Intent setClass(Context packageContext, Class<?> cls) {
mComponent = new ComponentName(packageContext, cls);
return this;
}
-------------------------------------------------------------------------------------------------------------------------------------
3.方法三
Intent intent2=new Intent();
intent2.setClassName(本类,将要跳转的类的包名);
startActivity(intent2);
见Intent.class 源码:
------------------------------------------------------------------------------------------------------------------------------------
public Intent setClassName(Context packageContext, String className) {
mComponent = new ComponentName(packageContext, className);
return this;
}
-------------------------------------------------------------------------------------------------------------------------------------
划重点
方法三里有一个的参数类型变了 Context & String
回到源码
@param className
The name of a class inside of the application package that will be used as the component for this Intent.
4.方法四
Intent intent2=new Intent();
intent2.setClassName(包名,将要跳转的类的包名);
startActivity(intent2);
见Intent.class 源码:
------------------------------------------------------------------------------------------------------------------------------------
public Intent setClassName(String packageName, String className) {
mComponent = new ComponentName(packageName, className);
return this;
}
-------------------------------------------------------------------------------------------------------------------------------------
划重点
方法三里有二个参数类型变了 String & String
回到源码
@param packageName
The name of the package implementing the desired component.
@param className
The name of a class inside of the application package that will be used as the component for this Intent.
5.方法五
Intent intent2=new Intent();
intent2.setComponent(new ComponentName(MainActivity.this, JumpToActivity.class));
startActivity(intent2);
见Intent.class 源码:
------------------------------------------------------------------------------------------------------------------------------------
public Intent setComponent(ComponentName component) {
mComponent = component;
return this;
}
-------------------------------------------------------------------------------------------------------------------------------------
发现没有 所有跳转都指向了一个 ComponentName 的东西 。。
ComponentName,顾名思义,就是组件名称,这个类主要用来定义一个应用程序的组件,通过调用Intent中的setComponent方法,我们可以打开同个应用以及不同应用中的组件。例如:Activity,Service。
传送门开启 https://blog.csdn.net/weixin_41953808/article/details/81613199
二、隐式调用方法
1.action跳转
Intent intent = new Intent();
intent.setAction("con.yy.test.jump");
startActivity(intent);
在AndroidManifest.xml中设置 将要跳转到的Activity 的action
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="con.yy.test.jump"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
2.通过Scheme 跳转协议跳转
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("yy://baiduSina:99hh?dd=wo"));
startActivity(intent);
见Intent.class 源码:
------------------------------------------------------------------------------------------------------------------------------------
public Intent(String action, Uri uri) {
setAction(action);
mData = uri;
}
-------------------------------------------------------------------------------------------------------------------------------------
setAction(action) 通过action跳转;
mData = uri 跳转到哪
先set 一个 Action ,有set 一个 uri 很清晰的 Android 的 跳转 or 启动的套路
在AndroidManifest.xml中<activity />标签增加<intent-filter />过滤器:
<activity
android:name=".GoodsDetailActivity"
android:theme="@style/AppTheme">
<intent-filter>
<!--协议部分,随便设置-->
<data
android:scheme="yy"
android:host="baidusina"
android:path="/hh"
android:port="8080"/>
<!--下面这几行也必须得设置-->
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
<intent-filter />过滤器 中 data便签,便是url的配置;
注意path这个参数,一定要先 / 在跟路径
划重点
"yy://baiduSina:99/hh?dd=wo
URL Scheme协议格式:
scheme: // host : port / path **
模式: // 主机 : 端口 / 路径 **
"yy: // baiduSina: 99 /hh?dd=wo
附加:
1.网页使用 scheme:
<a href="yy://baidusina:99/hh?dd=wo">
biubiu
</a>
2.跳转后新页面怎么获取传递参数
Uri uri = getIntent().getData();
String id = uri.getQueryParameter("id")
3.判断一个Scheme是否有效
PackageManager packageManager = getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("yy://baidu:99/hh?dd=wo"));
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isValid = !activities.isEmpty();
if (isValid) {
startActivity(intent);
}