如何根据meta-data内容杀指定应用
2016-12-20 15:29
381 查看
在开发一体机上具体应用过程中,发现一体机资源切换及不同的应用使用不同的资源。因为就需要在切换不同的信号源模式下
使用不同的资源。所以就想到使用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的方法
[java] view
plain copy
print?
<span style="font-size:18px;">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<String> 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<String> getRunningDtvApps(ActivityManager am,
PackageManager pm) {
List<String> plist = new ArrayList<String>();
List<ActivityManager.RunningAppProcessInfo> 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<ResolveInfo> 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);
}
}
}
</span>
下面具体列一下不同父元素,读取的方法情况(为了对比方便写在一个函数中了,可以根据情况拆分):
[java] view
plain copy
print?
<span style="font-size:18px;"> 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);
}
}</span>
使用不同的资源。所以就想到使用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的方法
[java] view
plain copy
print?
<span style="font-size:18px;">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<String> 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<String> getRunningDtvApps(ActivityManager am,
PackageManager pm) {
List<String> plist = new ArrayList<String>();
List<ActivityManager.RunningAppProcessInfo> 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<ResolveInfo> 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);
}
}
}
</span>
下面具体列一下不同父元素,读取的方法情况(为了对比方便写在一个函数中了,可以根据情况拆分):
[java] view
plain copy
print?
<span style="font-size:18px;"> 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);
}
}</span>
相关文章推荐
- 如何根据meta-data内容杀指定应用
- tag应用如何根据meta-data内容杀指定应用
- Android分享中,如何过滤指定的应用,并且对不同的分享方式发送不同的内容?
- 如何用.Net 取得指定网面的内容? How to get html web page data?
- Android分享中,如何过滤指定的应用,并且对不同的分享方式发送不同的内容?【转发】
- SSH框架应用之《商城开发》1-如何根据指定条件从数据库中取出数据
- Android分享中,如何过滤指定的应用,并且对不同的分享方式发送不同的内容?
- Android分享中,如何过滤指定的应用,并且对不同的分享方式发送不同的内容?
- Android分享中,如何过滤指定的应用,并且对不同的分享方式发送不同的内容?
- Android分享中,如何过滤指定的应用,并且对不同的分享方式发送不同的内容?
- Android分享中,如何过滤指定的应用,并且对不同的分享方式发送不同的内容?
- ajax中指定innerHTML时如何应用其中的SCRIPT的研究
- ajax中指定innerHTML时如何应用其中的SCRIPT的研究
- 如何让cxgrid既能充满又能根据内容进行宽度调整?
- 如何在AJAX应用中访问ADO.NET Data Service(续)——基于jquery框架
- vf表单中如何根据组合框内容而选择不同文件再根据不同文件改变文本框的内容
- 关于sharepoint 的如何动态写Meta部分的内容
- ajax指定为post但是未设置content-type时如何获取提交的内容
- 如何打开记事本并显示指定内容 - 回复 "苦苦苦" 的问题
- 如何让cxgrid既能充满又能根据内容进行宽度调整?