博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tag应用如何根据meta-data内容杀指定应用
阅读量:5999 次
发布时间:2019-06-20

本文共 6105 字,大约阅读时间需要 20 分钟。

最近应用开辟的过程当中出现了一个小问题,顺便记录一下原因和方法--tag应用

    应用场景:

在开辟一体机上具体应用过程当中,发现一体机资源切换及不同的应用应用不同的资源。因为就需要在切换不同的信号源模式下
应用不同的资源。所以就想到应用meta-data这一描述字进行杀死指定的应用。
在AndroidManifest.xml中,<meta-data>元素可以作为子元素,被包含在<activity>、<application> 、<service>和<receiver>元素中,
但不同的父元素,在应用时读取的方法也不同。
我的例子就是:
<meta-data android:name="androidtv.meidasource.mode" android:value='digit-mode" />
放在<application> ... </application> 之层次上

    ok,实现此功能很简单,就直接上代码吧!!

    

    上面的代码直接实现了一个kill指定meta-data进程的方法及根据包名运行一个activity的方法

    

package com.skyworth.dtv;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;import android.app.ActivityManager;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.pm.ApplicationInfo;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.content.pm.PackageManager.NameNotFoundException;import android.content.pm.ResolveInfo;import android.util.Log;public class DtvAppHelper {	public static final String META_SOURCE_MODE = "androidtv.meidasource.mode";	public static final String META_SOURCE_MODE_DTV = "dtv";	static final String TAG = "DtvAppCloseHelper";	static Method forceStopPackage = null;	public static void shutdownDtvApps(Context ctx) {		PackageManager pm = ctx.getPackageManager();		ActivityManager am = (ActivityManager) ctx				.getSystemService(Context.ACTIVITY_SERVICE);		List
list = getRunningDtvApps(am, pm); for (int i = 0; i < list.size(); i++) { Log.i(TAG, "will stop package name : " + list.get(i)); forceStopPackage(am, list.get(i)); } } private static void forceStopPackage(ActivityManager am, String pkgname) { try { if (forceStopPackage == null) { forceStopPackage = am.getClass().getDeclaredMethod( "forceStopPackage", String.class); } if (forceStopPackage != null) { forceStopPackage.setAccessible(true); forceStopPackage.invoke(am, pkgname); } } catch (Exception e) { Log.e(TAG, "forceStopPackage error:" + e); } } private static List
getRunningDtvApps(ActivityManager am, PackageManager pm) { List
plist = new ArrayList
(); List
applist = am .getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo appProcess : applist) { String[] pkgNameList = appProcess.pkgList; // 得到包名列表 int pid = appProcess.pid; for (int i = 0; i < pkgNameList.length; i++) { String pkgName = pkgNameList[i]; try { ApplicationInfo ai = pm.getApplicationInfo(pkgName, PackageManager.GET_META_DATA); if (ai.metaData != null) { String value = ai.metaData.getString(META_SOURCE_MODE); if (META_SOURCE_MODE_DTV.equals(value)) { Log.i(TAG, "packageName:" + pkgName + " process pid:" + pid); plist.add(pkgName); } } } catch (NameNotFoundException e) { Log.e(TAG, "get meta data is empty"); } } } return plist; } public static void runDtvApps(Context ctx, String packageName) { Log.i(TAG, "will start packageName:" + packageName); PackageInfo pi = null; try { pi = ctx.getPackageManager().getPackageInfo(packageName, 0); Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null); resolveIntent.setPackage(pi.packageName); PackageManager pManager = ctx.getPackageManager(); List
apps = pManager.queryIntentActivities( resolveIntent, 0); ResolveInfo ri = apps.iterator().next(); if (ri != null) { packageName = ri.activityInfo.packageName; String className = ri.activityInfo.name; Log.i(TAG, "packageName: " + packageName + " className:" + className); Intent intent = new Intent(Intent.ACTION_MAIN); ComponentName cn = new ComponentName(packageName, className); intent.setComponent(cn); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ctx.startActivity(intent); } } catch (Exception e) { Log.e(TAG, "start activity failed " + e); } }}
    每日一道理
因为自信,在呀呀学语时,我靠着纤嫩的双腿,迈出人生的第一步;因为自信,我一次次将第一名的奖状高高举起;因为自信,我毫不吝惜地剪掉飘逸的长发,在运动场上展现风采……感谢自信,它给了我一双翅膀,让我在电闪雷鸣中去飞翔,在风雨中去搏击人生!

    

    上面具体列一下不同父元素,读取的方法情况(为了比较方便写在一个函数中了,可以根据情况拆分):

void test(Context ctx, String packageName, String className) {		/* 在application的应用 */		try {			ApplicationInfo appInfo = ctx.getPackageManager()					.getApplicationInfo(packageName,							PackageManager.GET_META_DATA);			String msg = appInfo.metaData.getString("myMsg");			Log.i(TAG, "message :" + msg);						//TODO					} catch (Exception e) {			Log.e(TAG, "getApplicationInfo error:" + e);		}						/* 在Activity的应用 */		ComponentName cn = new ComponentName(packageName, className);		try {			ActivityInfo info = ctx.getPackageManager().getActivityInfo(cn,					PackageManager.GET_META_DATA);						String msg = info.metaData.getString("myMsg");			Log.i(TAG, "message :" + msg);						//TODO					} catch (Exception e) {			Log.e(TAG, "getActivityInfo error:" + e);		}				/* 在service的应用 */		try {			ServiceInfo info = ctx.getPackageManager().getServiceInfo(cn,					PackageManager.GET_META_DATA);			String msg = info.metaData.getString("myMsg");			Log.i(TAG, "message :" + msg);			// TODO		} catch (Exception e) {			Log.e(TAG, "getServiceInfo error:" + e);		}				/* 在receiver的应用 */		try {			ComponentName crn = new ComponentName(ctx, className);			ActivityInfo info = ctx.getPackageManager().getReceiverInfo(crn,					PackageManager.GET_META_DATA);			String msg = info.metaData.getString("myMsg");			Log.i(TAG, "message :" + msg);			// TODO		} catch (Exception e) {			Log.e(TAG, "getReceiverInfo error:" + e);		}	}

    

文章结束给大家分享下程序员的一些笑话语录: 大家喝的是啤酒,这时你入座了。

你给自己倒了杯可乐,这叫低配置。
你给自已倒了杯啤酒,这叫标准配置。
你给自己倒了杯茶水,这茶的颜色还跟啤酒一样,这叫木马。
你给自己倒了杯可乐,还滴了几滴醋,不仅颜色跟啤酒一样,而且不冒热气还有泡泡,这叫超级木马。
你的同事给你倒了杯白酒,这叫推荐配置。
菜过三巡,你就不跟他们客气了。
你向对面的人敬酒,这叫p2p。
你向对面的人敬酒,他回敬你,你又再敬他……,这叫tcp。
你向一桌人挨个敬酒,这叫令牌环。
你说只要是兄弟就干了这杯,这叫广播。
有一个人过来向这桌敬酒,你说不行你先过了我这关,这叫防火墙。
你的小弟们过来敬你酒,这叫一对多。
你是boss,所有人过来敬你酒,这叫服务器。
酒是一样的,可是喝酒的人是不同的。
你越喝脸越红,这叫频繁分配释放资源。
你越喝脸越白,这叫资源不释放。
你已经醉了,却说我还能喝,叫做资源额度不足。
你明明能喝,却说我已经醉了,叫做资源保留。
喝酒喝到最后的结果都一样
你突然跑向厕所,这叫捕获异常。
你在厕所吐了,反而觉得状态不错,这叫清空内存。
你在台面上吐了,觉得很惭愧,这叫程序异常。
你在boss面前吐了,觉得很害怕,这叫系统崩溃。
你吐到了boss身上,只能索性晕倒了,这叫硬件休克。

--------------------------------- 原创文章 By

tag和应用
---------------------------------

转载地址:http://zowmx.baihongyu.com/

你可能感兴趣的文章
maven 部署jar包到私服
查看>>
JAVA缓存原理及解决方案
查看>>
分页技术关键代码(java连接mysql)
查看>>
关于x210开发板和主机、虚拟机ping通问题
查看>>
问题解决
查看>>
Microsoft JScript 运行时错误
查看>>
JavaWeb项目:Shiro实现简单的权限控制(整合SSM)
查看>>
error C3872: "0xa0": 此字符不允许在标识符中使用
查看>>
Hadoop源码研究笔记--20120725--主要组成包
查看>>
.GB级数据库分区实现高性能
查看>>
开源项目spring-shiro-training思维导图
查看>>
WPF——TaskBarIconOverlay(任务栏图标叠加)
查看>>
去除a标签链接触摸时产生边框
查看>>
[转载]Huffman编码压缩算法
查看>>
webkit支持跨域的方法
查看>>
如何测试php是否连接mysql成功
查看>>
【前缀思想】二叉树中所有距离为 K 的结点
查看>>
基于Abp的WebApi容器
查看>>
【leetcode】991. Broken Calculator
查看>>
SQL Server登录 18456错误
查看>>