• tag应用如何根据metadata内容杀指定应用


    最近应用开辟的过程当中出现了一个小问题,顺便记录一下原因和方法--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<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);
    		}
    	}
    }
        每日一道理
    因为自信,在呀呀学语时,我靠着纤嫩的双腿,迈出人生的第一步;因为自信,我一次次将第一名的奖状高高举起;因为自信,我毫不吝惜地剪掉飘逸的长发,在运动场上展现风采……感谢自信,它给了我一双翅膀,让我在电闪雷鸣中去飞翔,在风雨中去搏击人生!

        

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

    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和应用
    ---------------------------------

  • 相关阅读:
    git版本超前了N个版本且落后了N个版本的解决办法
    CSS3与动画有关的属性transition、animation、transform对比
    禁止选中文本JS
    页面加载中jquery逐渐消失效果实现
    localstorage和sessionstorage上手使用记录
    点击除元素以外的任意地方隐藏元素js
    js准确获取当前页面url网址信息
    301、404、200、304、500HTTP状态
    对事件委托绑定click的事件的解绑
    RabbitMQ的安装和使用Python连接RabbitMQ
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3102202.html
Copyright © 2020-2023  润新知