关于判断activity是否存在

mcgradybryant
  • 62

各位,我用这个方法在
clipboard.png判断activity是否存在,
我把红色的的类名改成KoBe,但是还是显示这个activity存在;但是你看
clipboard.png
KoBe是不存在这个包里的,请问这是咋回事????

回复
阅读 9.8k
4 个回答
✓ 已被采纳

是时候放弃这个方法了,这个方法不知道祸害了多少人了。来看看Intent源码吧
setClassName

resolveActivity

正如有其他答主说的那样,并没有对component做校验,所以,不管你设置怎样的setClassName参数,返回的ComponentName必不为空,所以出现题主所说的activity总是存在的问题。
解决方案,用另一种方法

Intent intent = new Intent();
intent.setClassName(getPackageName(), "xxx.xxx.XxxActivity");
ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
if(resolveInfo != null) {
     //activity found
}else{
     //activity not found
}

注意,setClassName第二个参数是包名+类名

try {
    startActivity(new Intent(..));
} catch (ActivityNotFoundException e) {
    Toast.makeText(this, "Not installed.", LENGTH_SHORT).show();
}

用这个方法最简单粗暴

ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> list = am.getRunningTasks(100);
boolean isAppRunning = false;
String MY_PKG_NAME = "xx.xx.xx";
for (RunningTaskInfo info : list) {
    if (info.topActivity.getPackageName().equals(MY_PKG_NAME) || info.baseActivity.getPackageName().equals(MY_PKG_NAME)) {
        isAppRunning = true;
        
        break;
    }
}

可以使用ActivityManager判断

resolveActivity只是简单的返回setClassName设置的值
没有进行类是否存在的校验。
如果是同一个进程内,建议使用Class.forName(className)来检测类是否存在

public Intent setClassName(String packageName, String className) {
    mComponent = new ComponentName(packageName, className);
    return this;
}
public ComponentName resolveActivity(PackageManager pm) {
    if (mComponent != null) {
        return mComponent;
    }
    ...
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏