搜索

首页  >  问答  >  正文

android - 关于判断activity是否存在

各位,我用这个方法在
判断activity是否存在,
我把红色的的类名改成KoBe,但是还是显示这个activity存在;但是你看

KoBe是不存在这个包里的,请问这是咋回事????

天蓬老师天蓬老师2772 天前578

全部回复(4)我来回复

  • 巴扎黑

    巴扎黑2017-04-17 17:58:38

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

    正如有其他答主说的那样,并没有对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第二个参数是包名+类名

    回复
    0
  • PHP中文网

    PHP中文网2017-04-17 17:58:38

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

    用这个方法最简单粗暴

    回复
    0
  • 迷茫

    迷茫2017-04-17 17:58:38

    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判断

    回复
    0
  • 迷茫

    迷茫2017-04-17 17:58:38

    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;
        }
        ...
    }

    回复
    0
  • 取消回复