如何根据meta-data内容杀指定应用

在开发一体机上具体应用过程中,发现一体机资源切换及不同的应用使用不同的资源。因为就需要在切换不同的信号源模式下
使用不同的资源。所以就想到使用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 ?
  1. <span style="font-size:18px;">package com.skyworth.dtv;  
  2.   
  3. import java.lang.reflect.Method;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import android.app.ActivityManager;  
  8. import android.content.ComponentName;  
  9. import android.content.Context;  
  10. import android.content.Intent;  
  11. import android.content.pm.ApplicationInfo;  
  12. import android.content.pm.PackageInfo;  
  13. import android.content.pm.PackageManager;  
  14. import android.content.pm.PackageManager.NameNotFoundException;  
  15. import android.content.pm.ResolveInfo;  
  16. import android.util.Log;  
  17.   
  18. public class DtvAppHelper {  
  19.     public static final String META_SOURCE_MODE = "androidtv.meidasource.mode";  
  20.     public static final String META_SOURCE_MODE_DTV = "dtv";  
  21.     static final String TAG = "DtvAppCloseHelper";  
  22.     static Method forceStopPackage = null;  
  23.   
  24.     public static void shutdownDtvApps(Context ctx) {  
  25.         PackageManager pm = ctx.getPackageManager();  
  26.         ActivityManager am = (ActivityManager) ctx  
  27.                 .getSystemService(Context.ACTIVITY_SERVICE);  
  28.         List<String> list = getRunningDtvApps(am, pm);  
  29.         for (int i = 0; i < list.size(); i++) {  
  30.             Log.i(TAG, "will stop package name : " + list.get(i));  
  31.             forceStopPackage(am, list.get(i));  
  32.         }  
  33.     }  
  34.   
  35.     private static void forceStopPackage(ActivityManager am, String pkgname) {  
  36.         try {  
  37.             if (forceStopPackage == null) {  
  38.                 forceStopPackage = am.getClass().getDeclaredMethod(  
  39.                         "forceStopPackage", String.class);  
  40.             }  
  41.             if (forceStopPackage != null) {  
  42.                 forceStopPackage.setAccessible(true);  
  43.                 forceStopPackage.invoke(am, pkgname);  
  44.             }  
  45.         } catch (Exception e) {  
  46.             Log.e(TAG, "forceStopPackage error:" + e);  
  47.         }  
  48.     }  
  49.   
  50.     private static List<String> getRunningDtvApps(ActivityManager am,  
  51.             PackageManager pm) {  
  52.         List<String> plist = new ArrayList<String>();  
  53.         List<ActivityManager.RunningAppProcessInfo> applist = am  
  54.                 .getRunningAppProcesses();  
  55.         for (ActivityManager.RunningAppProcessInfo appProcess : applist) {  
  56.             String[] pkgNameList = appProcess.pkgList; // 得到包名列表  
  57.             int pid = appProcess.pid;  
  58.             for (int i = 0; i < pkgNameList.length; i++) {  
  59.                 String pkgName = pkgNameList[i];  
  60.                 try {  
  61.                     ApplicationInfo ai = pm.getApplicationInfo(pkgName,  
  62.                             PackageManager.GET_META_DATA);  
  63.                     if (ai.metaData != null) {  
  64.                         String value = ai.metaData.getString(META_SOURCE_MODE);  
  65.                         if (META_SOURCE_MODE_DTV.equals(value)) {  
  66.                             Log.i(TAG, "packageName:" + pkgName  
  67.                                     + " process pid:" + pid);  
  68.                             plist.add(pkgName);  
  69.                         }  
  70.                     }  
  71.                 } catch (NameNotFoundException e) {  
  72.                     Log.e(TAG, "get meta data is empty");  
  73.                 }  
  74.             }  
  75.         }  
  76.         return plist;  
  77.     }  
  78.       
  79.     public static void runDtvApps(Context ctx, String packageName) {  
  80.         Log.i(TAG, "will start packageName:" + packageName);  
  81.         PackageInfo pi = null;  
  82.         try {  
  83.             pi = ctx.getPackageManager().getPackageInfo(packageName, 0);  
  84.             Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);  
  85.             resolveIntent.setPackage(pi.packageName);  
  86.             PackageManager pManager = ctx.getPackageManager();  
  87.             List<ResolveInfo> apps = pManager.queryIntentActivities(  
  88.                     resolveIntent, 0);  
  89.   
  90.             ResolveInfo ri = apps.iterator().next();  
  91.             if (ri != null) {  
  92.                 packageName = ri.activityInfo.packageName;  
  93.                 String className = ri.activityInfo.name;  
  94.                 Log.i(TAG, "packageName: " + packageName + " className:"  
  95.                         + className);  
  96.                 Intent intent = new Intent(Intent.ACTION_MAIN);  
  97.                 ComponentName cn = new ComponentName(packageName, className);  
  98.                 intent.setComponent(cn);  
  99.                 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  100.                 ctx.startActivity(intent);  
  101.             }  
  102.         } catch (Exception e) {  
  103.             Log.e(TAG, "start activity failed " + e);  
  104.         }  
  105.     }  
  106. }  
  107. </span>  


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

[java]  view plain  copy
 print ?
  1. <span style="font-size:18px;">  void test(Context ctx, String packageName, String className) {  
  2.         /* 在application的应用 */  
  3.         try {  
  4.             ApplicationInfo appInfo = ctx.getPackageManager()  
  5.                     .getApplicationInfo(packageName,  
  6.                             PackageManager.GET_META_DATA);  
  7.   
  8.             String msg = appInfo.metaData.getString("myMsg");  
  9.             Log.i(TAG, "message :" + msg);  
  10.               
  11.             //TODO  
  12.               
  13.         } catch (Exception e) {  
  14.             Log.e(TAG, "getApplicationInfo error:" + e);  
  15.         }         
  16.           
  17.         /* 在Activity的应用 */  
  18.         ComponentName cn = new ComponentName(packageName, className);  
  19.   
  20.         try {  
  21.             ActivityInfo info = ctx.getPackageManager().getActivityInfo(cn,  
  22.                     PackageManager.GET_META_DATA);  
  23.               
  24.             String msg = info.metaData.getString("myMsg");  
  25.             Log.i(TAG, "message :" + msg);  
  26.               
  27.             //TODO  
  28.               
  29.         } catch (Exception e) {  
  30.             Log.e(TAG, "getActivityInfo error:" + e);  
  31.         }  
  32.           
  33.         /* 在service的应用 */  
  34.         try {  
  35.             ServiceInfo info = ctx.getPackageManager().getServiceInfo(cn,  
  36.                     PackageManager.GET_META_DATA);  
  37.   
  38.             String msg = info.metaData.getString("myMsg");  
  39.             Log.i(TAG, "message :" + msg);  
  40.   
  41.             // TODO  
  42.   
  43.         } catch (Exception e) {  
  44.             Log.e(TAG, "getServiceInfo error:" + e);  
  45.         }  
  46.           
  47.         /* 在receiver的应用 */  
  48.         try {  
  49.             ComponentName crn = new ComponentName(ctx, className);  
  50.             ActivityInfo info = ctx.getPackageManager().getReceiverInfo(crn,  
  51.                     PackageManager.GET_META_DATA);  
  52.             String msg = info.metaData.getString("myMsg");  
  53.             Log.i(TAG, "message :" + msg);  
  54.   
  55.             // TODO  
  56.   
  57.         } catch (Exception e) {  
  58.             Log.e(TAG, "getReceiverInfo error:" + e);  
  59.         }  
  60.     }</span>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值