关于实现点击某个应用时弹出自己指定的应用

本人第一篇文章有不足处请见谅


公司有一个功能是要实现类似于360安全通讯录那样,点击拨号按钮跳转到自己的应用,我的思路是这样的


方案:

1、捕获点击拨号按钮时的广播,再跳转到自己的应用,并将拨号盘关掉

2、监听栈顶的应用,判断是否为拨号盘,如果是则跳转到我的应用,否则不理

3、修改luncher的文件,使点击拨号键时跳转到我们希望的地方


-------------------------------痛苦才刚刚开始啊-----------------------------------------


尝试方案一

先是看了点击拨号盘按钮时的打印信息


发现没有任何广播信息啊,我就开始了从网上的慢长查找

有人说可以监听“android.intent.action.call”

我试 一下,失败;

然后我自己又试了几个,如下:

android.intent.action.call_button

android.intent.action.VIEW【想通过监听是否有新的view产生来判断,哎……】


试了N多,最终,失败……


--------------方案二-------------

我个人对这个方法很抵触,因为觉的占资源会,但现在只能用这个了


写了一个ServiceOfMonitor用来监听

功能就是通过activitymanager得到栈顶的应用,判断是否为我想监听的

package com.example.testcall;

import java.util.List;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

/**
 * 此服务为应用监听服务,现在只监听
 * 
 * 拨号盘 {act=android.intent.action.DIAL cat=[android.intent.category.LAUNCHER]
 * cmp=com.android.contacts/.activities.DialtactsActivity
 * 
 * 
 * 
 * @author samzhang
 * 
 */
public class ServiceOfMonitor extends Service {
	private ActivityManager am;

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate() {
		am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Thread monitorThread = new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					List<RunningTaskInfo> topOne = am.getRunningTasks(1);
					if (topOne != null && topOne.size() > 0) {
						RunningTaskInfo top = topOne.get(0);
						int id = top.id;
						Log.e("TAG", "id:" + id);
						ComponentName ci = top.topActivity;
						String className = ci.getClassName();
						Log.e("TAG", "className:" + className);
						String packageName = ci.getPackageName();
						Log.e("TAG", "packageName:" + packageName);
						if (packageName.equals("com.example.testall")) {

							Intent i = new Intent(ServiceOfMonitor.this,
									MainActivity.class);
							i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
							startActivity(i);
						}
					}
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		});
		monitorThread.start();
		return super.onStartCommand(intent, flags, startId);
	}
}

代码很简单,需要加上权限

 <uses-permission android:name="android.permission.GET_TASKS" />


可以监听到想要的应用了,但问题也来了,怎么关掉这个应用

又是各种尝试

1、android.os.Process.killProcess(pid);

2、system.exit(pid);

3、am.killBackgroundProcesses("com.example.testall");

4、adb的操作(详见此高人http://blog.csdn.net/dliyuedong/article/details/24448899

5、

 Method forceStopPackage =am.getClass().getDeclaredMethod("forceStopPackage",String.class);
 forceStopPackage.setAccessible(true);
forceStopPackage.invoke(am,"com.example.testall");
除了4以外都失败了,但是4里的方法需要root,而网上说的3我也成功不了,可能我用的方法不对,但就是没达到效果,只说一下最后一种


最后一种在模拟器上是成功的,因为他的platform.x508.pem 和 platform.pk8 与模拟器上是相同的(都是源码,参考了http://www.cnblogs.com/brucenan/archive/2012/10/04/2711817.html


---------------------灵光一闪-------------------------

想再看一360的效果,结果发现一个问题,在长按home键后可以看到系统的拨号页面存在,原来360并没有关掉系统的,只是让他回到了桌面也就是相当于按了Home键,这下好办了

if中的代码替换如下就可以了

if (packageName.equals("com.example.testall")) {
							
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
Intent i = new Intent(ServiceOfMonitor.this,MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
						}




-------------------------终于可以交差了-------------------------------


再说一下方案三,因为这个方法是要修改luncher中的东西,所以必须要root,但看360的在root和非root下都可以用,还有就是各家的lucher名都不一样,涉及的东西也多我也就没试了,有想法的朋友可以再试试,大家交流。


本的写的可能有的地方不对不足,引用了一些高人的东西,希望见谅。

demo 下载





【本文由“科基大大”发布,2017年9月27日】



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值