Android 获取App相关信息

整理一些常用的关于查询应用信息的工具方法,以便日后使用

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Android设备上的应用程序会使用缓存来提高其性能。缓存是一种内存储存,用于暂时存储数据,以便下次更快地访问。但是,缓存的过度使用对设备性能和存储空间都会产生影响。因此,Android系统允许用户查看和管理每个应用程序的缓存使用情况。 要获取应用程序的缓存使用情况,可以按照以下步骤操作: 1. 打开设备的“设置”应用程序。 2. 在设置应用程序中选择“应用程序”或“应用管理器”选项,这取决于您的设备型Android版本。 3. 从列表中选择您想要检查的应用程序。 4. 在应用程序详细信息页面上,您可以看到应用程序占用的总存储空间、已安装空间和缓存空间的大小。 5. 点击“缓存”选项将显示这个应用程序的缓存大小。 6. 如果您想要清除缓存,可以点击“清除缓存”按钮。 以上就是如何在Android设备上获取应用程序缓存使用情况的简单步骤。通过查看和管理应用程序的缓存使用情况,可以释放存储空间,提高设备性能,并且确保您的应用程序在最佳的运行状态下工作。 ### 回答2: Android获取app占用缓存很简单。缓存是指临时存储的数据,例如图片、音频或视频等文件可以被缓存。缓存数据可以提高应用程序的性能,因为它使应用程序可以更快地从手机中读取数据,并且可以减少数据的使用情况。 要获取Android应用程序占用缓存,可以在Android设备中执行以下步骤: 1. 打开设置应用程序。 2. 然后点击“应用程序”。 3. 在打开的列表中找到你要查看的应用程序。 4. 点击该应用程序以打开详情页面。 5. 在详情页面中,你可以看到应用程序的大小以及它占用了多少存储空间和多少缓存。 6.如果你希望清除缓存,请点击“清除缓存”按钮。 请注意,清除应用程序的缓存可能会导致无法加载某些数据,因为它们需要重新下载或重新缓存。所以请在仔细考虑清除缓存之前,确定这样做不会导致不必要的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值