关于实现点击某个应用时弹出自己指定的应用
2015-03-04 16:35
218 查看
本人第一篇文章有不足处请见谅
公司有一个功能是要实现类似于360安全通讯录那样,点击拨号按钮跳转到自己的应用,我的思路是这样的
方案:
1、捕获点击拨号按钮时的广播,再跳转到自己的应用,并将拨号盘关掉
2、监听栈顶的应用,判断是否为拨号盘,如果是则跳转到我的应用,否则不理
3、修改luncher的文件,使点击拨号键时跳转到我们希望的地方
-------------------------------痛苦才刚刚开始啊-----------------------------------------
尝试方案一
先是看了点击拨号盘按钮时的打印信息
发现没有任何广播信息啊,我就开始了从网上的慢长查找
有人说可以监听“android.intent.action.call”
我试 一下,失败;
然后我自己又试了几个,如下:
android.intent.action.call_button
android.intent.action.VIEW【想通过监听是否有新的view产生来判断,哎……】
试了N多,最终,失败……
--------------方案二-------------
我个人对这个方法很抵触,因为觉的占资源会,但现在只能用这个了
写了一个ServiceOfMonitor用来监听
功能就是通过activitymanager得到栈顶的应用,判断是否为我想监听的
代码很简单,需要加上权限
<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、
最后一种在模拟器上是成功的,因为他的platform.x508.pem 和 platform.pk8 与模拟器上是相同的(都是源码,参考了http://www.cnblogs.com/brucenan/archive/2012/10/04/2711817.html)
---------------------灵光一闪-------------------------
想再看一360的效果,结果发现一个问题,在长按home键后可以看到系统的拨号页面存在,原来360并没有关掉系统的,只是让他回到了桌面也就是相当于按了Home键,这下好办了
if中的代码替换如下就可以了
-------------------------终于可以交差了-------------------------------
再说一下方案三,因为这个方法是要修改luncher中的东西,所以必须要root,但看360的在root和非root下都可以用,还有就是各家的lucher名都不一样,涉及的东西也多我也就没试了,有想法的朋友可以再试试,大家交流。
本的写的可能有的地方不对不足,引用了一些高人的东西,希望见谅。
demo 下载
【本文由“科基大大”发布,2017年9月27日】
公司有一个功能是要实现类似于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日】
相关文章推荐
- 实现在自己的程序中点击一个按钮,然后弹出系统自带的联系人
- 1怎样让输入的text文本填写的部分只添加数字、2怎样将输入的数字一次性全部删除 3怎样选择密码 让它不显示 4 怎样实现在没有return的情况下点击button的情况下就能够使键盘页面下落5 怎样实现点击指定的button来对使指定的text进行键盘弹出 6怎样改变button按钮的状态
- 关于在Fragment中去实现点击Menu键弹出菜单
- 关于 JavaScript弹出窗体 点击按钮返回选择数据 的实现
- GridView如何实现点击某行的指定列弹出新窗体
- 如何实现web应用下载文件时不弹出文件保存对话框,而是直接保存到指定的文件中
- android 文件关联的方法 实现点击文件打开指定应用软件
- 基于Android实现点击某个按钮让菜单选项从按钮周围指定位置弹出
- 用javascript实现点击链接弹出"图片另存为"而不是直接打开
- 关于showModalDialog()弹出窗口.更改了页面的数据,再次点击页面却没有刷新
- 关于showModalDialog()弹出窗口.更改了页面的数据,再次点击页面却没有刷新
- vb应用--快速排序-法实现二维数组的指定列排序
- 在.cs 中实现弹出警告框然后点击实现关闭
- 关于gatagrid的应用,---自己收录,备查20071022
- 关于showModalDialog()弹出窗口.更改了页面的数据,再次点击页面却没有刷新-cache 处理
- winform中如何实现自动点击webbrowser弹出对话框中的确定按钮
- winform中如何实现自动点击webbrowser弹出对话框中的确定按钮
- 关于9080端口和80端口实现真正意义的WebServer+ApplicationServer结合应用
- 用javascript实现点击链接弹出"图片另存为"而不是直接打开
- [DevExpress控件应用]XtraNavBar: 实现弹出快捷菜单功能