一、显式调用方法
1. 方法一:
```java
Intent intent = new Intent(当前类, 目标类);
// intent = new Intent(MainActivity.this, JumpToActivity.class);
startActivity(intent);
```
2. 方法二:
```java
Intent intent2 = new Intent();
intent2.setClass(当前类, 目标类);
// intent2.setClass(MainActivity.this, JumpToActivity.class);
startActivity(intent2);
```
3. 方法三:(此方式可用于打开其他应用)
```java
Intent intent2 = new Intent();
intent2.setComponent(new ComponentName(当前类, 目标类));
startActivity(intent2);
```
其中,`component`为目标组件的包或类名称(完整类名)。在使用`component`进行匹配时,一般采用以下几种形式:
```java
intent.setComponent(new ComponentName(getApplicationContext(), 目标类));
intent.setComponent(new ComponentName(getApplicationContext(), "com.liujc.test.JumpToActivity"));
intent.setComponent(new ComponentName("com.liujc.test", "com.liujc.test.JumpToActivity"));
```
如需了解`ComponentName`,请移步Android ComponentName的用法。
二、隐式调用方法
通过action跳转:
```java
Intent intent = new Intent();
intent.setAction("con.liujc.test.jump");
startActivity(intent);
```
要实现跳转到另一个Activity,需要在AndroidManifest.xml文件中的相应Activity标签内添加`
1. 在AndroidManifest.xml文件中找到目标Activity的标签,例如`.JumpToActivity`。
2. 在该标签内添加`
3. 在`
4. 在`
5. (可选)如果需要指定跳转到的页面,可以在`
6. (可选)如果需要传递参数,可以在`
完成以上操作后,当用户点击某个链接或者按钮时,系统会根据设置好的URL Scheme进行跳转。
示例代码:
```xml
```
要获取Scheme跳转的参数,可以通过在AndroidManifest.xml文件中为对应的Activity添加intent-filter来实现。以下是一个示例:
```xml
android:name=".GoodsDetailActivity" android:theme="@style/AppTheme">
android:scheme="liujc" android:host="goods" android:path="/goodsDetail" android:port="8080"/>
```
在这个示例中,我们通过添加一个intent-filter来定义了如何从其他App(通过指定的协议、主机、路径和端口)跳转到这个Activity。当其他App尝试使用这个协议跳转时,系统会根据这些配置找到相应的Activity并执行。
要判断一个Scheme是否有效并在有效后启动,可以先创建一个Uri对象,然后检查其scheme部分是否为有效的scheme。以下是一个示例:
```java
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri uri = getIntent().getData();
if (uri != null) {
// 完整的url信息
String url = uri.toString();
Log.e(TAG, "url: " + uri);
// scheme部分
String scheme = uri.getScheme();
Log.e(TAG, "scheme: " + scheme);
// host部分
String host = uri.getHost();
Log.e(TAG, "host: " + host);
//port部分
int port = uri.getPort();
Log.e(TAG, "port: " + port);
// 访问路劲
String path = uri.getPath();
Log.e(TAG, "path: " + path);
List
// Query部分
String query = uri.getQuery();
Log.e(TAG, "query: " + query);
//获取指定参数值
String goodsId = uri.getQueryParameter("goodsId");
Log.e(TAG, "goodsId: " + goodsId);
} else {
// Scheme无效时的处理逻辑
}
}
}
```
在这个示例中,我们首先获取Intent中的Uri对象。然后,我们检查Uri的scheme部分是否为有效的scheme。如果是有效的scheme,我们将继续执行后续操作;否则,我们可以在else语句中处理Scheme无效的情况。
以下是重构后的代码,我使用了更简洁的代码结构并添加了一些注释以提高可读性:
```java
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取包管理器
PackageManager packageManager = getPackageManager();
// 创建一个用于打开商品详情页面的Intent
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri goodDetailUrl = Uri.parse("liujc://goods:8080/goodsDetail?goodsId=20170112");
intent.setData(goodDetailUrl);
// 查询可以处理该Intent的应用列表
List
// 判断是否有应用可以处理该Intent
boolean isValid = !activities.isEmpty();
if (isValid) {
// 如果有应用可以处理该Intent,则启动该应用并打开商品详情页面
startActivity(intent);
} else {
// 如果没有应用可以处理该Intent,打印日志并提示用户
Log.e(TAG, "没有应用可以处理该Intent");
Snackbar.make(findViewById(R.id.main_layout), "没有应用可以处理该Intent", Snackbar.LENGTH_LONG).show();
}
}
}
```
在这个重构后的代码中,我们首先获取了`PackageManager`对象,然后创建了一个用于打开商品详情页面的`Intent`。接着,我们使用`packageManager.queryIntentActivities()`方法来查询可以处理该`Intent`的应用列表。最后,根据查询结果判断是否有应用可以处理该`Intent`,如果有,则启动该应用并打开商品详情页面;如果没有,则打印日志并提示用户。