android - 关于判断activity是否存在

浏览:70日期:2022-11-16

问题描述

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

问题解答

回答1:

是时候放弃这个方法了,这个方法不知道祸害了多少人了。来看看Intent源码吧android - 关于判断activity是否存在

android - 关于判断activity是否存在

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

回答2:

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

用这个方法最简单粗暴

回答3:

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

回答4:

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

相关文章: