整理一些常用的关于查询应用信息的工具方法,以便日后使用
1.Android 获取进程名
private static String getProcessName() {
BufferedReader cmdlineReader = null;
try {
cmdlineReader = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/" + android.os.Process.myPid() + "/cmdline"), "iso-8859-1"));
int c;
StringBuilder processName = new StringBuilder();
while ((c = cmdlineReader.read()) > 0) {
processName.append((char) c);
}
return processName.toString();
} catch (Exception ignore) {
} finally {
try {
if (cmdlineReader != null) {
cmdlineReader.close();
}
} catch (IOException ignore) {
}
}
return "";
}
2. 安装指定路径下的Apk
/**
* 安装指定路径下的Apk
*/
public void installApk(String apkFilePath) {
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.fromFile(new File(apkFilePath)), "application/vnd.android.package-archive");
startActivityForResult(intent, 0);
}
3. 卸载指定包名的App
/**
* 卸载指定包名的App
*/
public void uninstallApp(String packageName) {
Intent intent = new Intent();
intent.setAction("android.intent.action.DELETE");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:" + packageName));
startActivityForResult(intent, 0);
}
4. 获取App的名称,版本号
/**
* 获取App名称,版本号
*/
public static void getAppNameAndVersionName(Context context) {
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(
context.getPackageName(), 0);
int labelRes = packageInfo.applicationInfo.labelRes;
//获取app名称
String label = context.getResources().getString(labelRes);
//获取app versionName
String versionName = info.versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
5. 启动APK的默认Activity
public static void startApkActivity(final Context ctx, String packageName) {
PackageManager pm = ctx.getPackageManager();
PackageInfo pi;
try {
pi = pm.getPackageInfo(packageName, 0);
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setPackage(pi.packageName);
List<ResolveInfo> apps = pm.queryIntentActivities(intent, 0);
ResolveInfo ri = apps.iterator().next();
if (ri != null) {
String className = ri.activityInfo.name;
intent.setComponent(new ComponentName(packageName, className));
ctx.startActivity(intent);
}
} catch (NameNotFoundException e) {
Log.e("startActivity", e);
}
}
6. 打开指定包名的App
/**
* 打开指定包名的App
*/
public void openSpecifiedApp(String packageName){
PackageManager manager = getPackageManager();
Intent launchIntentForPackage = manager.getLaunchIntentForPackage(packageName);
if (launchIntentForPackage != null) {
startActivity(launchIntentForPackage);
}
}
7. 获取最近一次活跃的应用的包名
/**
* 获取最近一次活跃的应用的包名
*/
public Set<String> getTopPackageSet() {
Set<String> topSet = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// getRunningTasks在5.0以上为deprecated,采用其他方式判断
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfoList = mActivityManager.getRunningAppProcesses();
if (runningAppProcessInfoList != null && runningAppProcessInfoList.size() > 0) {
String pkgList[] = runningAppProcessInfoList.get(0).pkgList;
if (pkgList != null && pkgList.length > 0) {
topSet = new HashSet<String>(pkgList.length);
for (String pkg : pkgList) {
topSet.add(pkg);
}
}
}
} else {
topSet = new HashSet<String>(1);
topSet.add(mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName());
}
return topSet;
}
8. 用于检测app是否处于前台可见(只能用于Android7.0以下版本)
方法一:
/**
* 用于检测app是否处于前台可见(只能用于Android7.0以下版本)
* @param packageName
* @return
*/
public boolean checkAppIsForeground(String packageName) {
PackageManager pm = App.getApp().getPackageManager();
PackageInfo pInfo;
try {
pInfo = pm.getPackageInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException ignore) {
return false;
}
String uid = String.valueOf(pInfo.applicationInfo.uid);//as 10045
uid = uid.replaceFirst("10+", "");
//"u0_a31 3305 396 1225804 84148 bg SyS_epoll_ 00000000 S com.android.vending"
try {
java.lang.Process ps = Runtime.getRuntime().exec("ps -P");
InputStream is = ps.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
for (String line; (line = reader.readLine()) != null; ) {
String[] info = line.split("\\s+");
String userId = info[0];
String processName = info[info.length - 1];//as com.android.vending
if (userId.endsWith(uid) && packageName.equals(processName)) {
String state = info[5];//e.g fg|bg|ta
return !"bg".equals(state);
}
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
方法二:判断当前App处于前台还是后台
/**
* 判断当前App处于前台还是后台
* 需添加<uses-permission android:name="android.permission.GET_TASKS"/>
* 并且必须是系统应用该方法才有效
*/
public static boolean isApplicationBackground(final Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
@SuppressWarnings("deprecation")
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
return true;
}
}
return false;
}
9. 打开指定包名的App应用信息界面
/**
* 打开指定包名的App应用信息界面
*/
public void showAppInfo(String packageName) {
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);
}
10. 分享Apk信息
/**
* 分享Apk信息
*/
public void shareApkInfo(String info) {
Intent intent = new Intent();
intent.setAction("android.intent.action.SEND");
intent.addCategory("android.intent.category.DEFAULT");
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, info);
startActivity(intent);
}
11. 获取手机上已安装并且可启动的应用列表
注意:使用getInstalledApplications会返回很多无法启动甚至没有图标的系统应用。ResolveInfo.activityInfo.applicationInfo也能取到你想要的数据
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> activities = getPackageManager().queryIntentActivities(intent, 0);
12.有时我们想在自己的应用中去启动第三方应用,该怎么实现呢?
每个应用都有一个主activity,也就是在点击桌面点击图标的时候第一个启动的activity,这activity有个特点,它在AndroidManifest.xml中配置IntentFilter的时候既配了android.intent.action.MAIN,又配置了android.intent.category.LAUNCHER,所以可以根据这个特点通过java代码去调用这个activity。下面直接上个简单的例子。
来个例子:
1. 第三方应用的主activity在AndroidManifest.xml配置如下所示:
<activity
android:name="com.cjl.myapp.MainActivity"
android:hardwareAccelerated="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2. 在我们自己的应用中直接调用以下方法即可启动第三方应用
public static void startMainActivity(final Context context, String packageName) {
PackageManager pm = context.getPackageManager();
PackageInfo packageInfo = null;
try {
packageInfo = pm.getPackageInfo(packageName, 0);
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setPackage(packageInfo.packageName);
List<ResolveInfo> apps = pm.queryIntentActivities(intent, 0);
ResolveInfo resolveInfo = apps.iterator().next();
if (resolveInfo != null) {
String className = resolveInfo.activityInfo.name;
intent.setComponent(new ComponentName(packageName, className));
context.startActivity(intent);
}
} catch (NameNotFoundException e) {
}
}
3. 调用方法:
startMainActivity(this, "com.cjl.myapp");
13. 判断应用从哪里安装的
//判断是否来自Google Play
public boolean isPlayInstalled() {
PackageManager pm = mContext.getPackageManager();
String installPackage = pm.getInstallerPackageName(mContext.getPackageName());
return TextUtils.equals("com.android.vending", installPackage);
}