最近遇到了这样一个需求,就是为了用户的方便,要实现几个app之间的切换,说白了也就是从一个app跳转到另一个app。问题其实很简单,但是为了使用起来方便,弄成一个工具类分享出来
1.工具类代码
/**
* app跳转工具类
*/
public class AppJumpUtil {
//想要跳转到的包名
public static final String PACKAGE_NAME = "com.xxx.xxx";
//这里可以根据自己的需要选择跳转到的Activity的路径
public static final String CLASS_NAME = "com.xxx.xxx.LoginActivity";
/**
* 判断apk是否安装
*
* @param context
* @return
*/
public static boolean isAppInstalled(Context context, String packageName) {
PackageManager pm = context.getPackageManager();
try {
pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
public static void JumpToActivity(Context context, String packageName, String className) {
Intent intent = new Intent();
intent.setClassName(packageName, className);
//可以根据自己的需要增加参数
intent.putExtra("flag", "Jump");
context.startActivity(intent);
}
}
2.如何使用(例如从app1中的MainActivity,跳转到app2的LoginActivity)
app1-MainActivity
binding.tvJump.setOnClickListener(v -> {
if(!isAppInstalled(this,PACKAGE_NAME)){
ToastUtil.showShortToast(this,"应用不存在,请确认已安装该应用");
return;
}
AppJumpUtil.JumpToActivity(MainActivity.this, PACKAGE_NAME, CLASS_NAME);
});
app2-LoginActivity
Intent intent=getIntent();
String flag = intent.getStringExtra("flag");
if("Jump".equals(flag)){
//调起来登录页之后的处理,比如这里我想给自动登录的标志位赋值
isAutoLogin = true;
}
那么这样的话,就实现了想要的Android 跳转到另一个App的功能。
写在后面:
其实在AppJumpUtil中的Jump方法中就完全可以做isAppinstalled的判断,如下:
public static void JumpToActivity(Context context, String packageName, String className) {
if(!isAppInstalled(context,packageName)){
Toast.makeText(context, "应用不存在,请确认已安装该应用",Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setClassName(packageName, className);
intent.putExtra("flag", "Jump");
context.startActivity(intent);
}
然后外面调用的时候直接调AppJumpUtil.JumpToActivity()方法,更简单
但是这样检查app是否存在就与跳转另一个app的操作连在了一起,那么有一个坏处就是,比如说,有些操作必须得放在跳转之前处理,但是如果应用不存在的话还不能执行。那这种时候,显然这样写就有点问题
那么就只能像上面给的工具类里面的那样,给分开来,让在业务中分别调用检查app存在,以及执行跳转动作
想表达什么意思呢,就是说,工具类在保证不零碎的前提之下,尽可能的对外暴露更多的“可能性”,要不然,确实是做到了高内聚,里面写的方法都是与我们想要实现的“跳转到另一个app”的功能高度相关的,但是对于业务来说,检查存在和执行跳转耦合在一块了
确实我们可以在修改业务代码中,再调用一次检查app是否存在的方法不就行了么,确实可以,但是那样的写法,总觉得有点冗余了。当然如果你没有我上面说的那种场景,这种方法更优,还是那句话,一切都从实际出发
好了,也没啥意思,就啰嗦这么几句