- 用户点击“电子邮件”应用(例如)
- 我的应用程序检测到应用程序的启动
- 我的应用程序确认它是“电子邮件”应用程序
- 我的应用程序打开一个视图,要求输入密码
- 用户输入密码,如果正确,我的应用程序消失,留下“电子邮件”应用程序
有人能帮忙吗?我是否以正确的方式寻找新应用程序广播来启动,或者应该在系统日志中查找新意图,或者在本地代码中做一些处理?
任何提示都会有所帮助,即使您不能完全回答,我也能进行更多研究。非常感谢。Ian
我认为我们可以使用 logcat
并分析它的输出。
在所有类似的程序中,我找到了这个权限:
android.permission.READ_LOGS
这意味着它们都在使用它,但似乎程序会启动,然后我们的程序(应用程序保护器)将启动并置于前台。
使用以下代码:
try
{
Process mLogcatProc = null;
BufferedReader reader = null;
mLogcatProc = Runtime.getRuntime().exec(new String[]{"logcat", "-d"});
reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()));
String line;
final StringBuilder log = new StringBuilder();
String separator = System.getProperty("line.separator");
while ((line = reader.readLine()) != null)
{
log.append(line);
log.append(separator);
}
String w = log.toString();
Toast.makeText(getApplicationContext(),w, Toast.LENGTH_LONG).show();
}
catch (Exception e)
{
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
不要忘记在Manifest文件中添加它的权限。
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();
您可以浏览该列表以查看手机上正在运行的内容。 现在,您可以通过 ID 和 processName 进行标识,因此对于标准活动而言较为容易,但对于自定义应用程序,除非停止它们所有的运行,否则很难进行区分......
注意:这不是屏幕上实际显示的内容列表,而只是正在运行的内容列表...这可能使您的目标无效,但至少您会知道何时有东西开始运行...即使在后台,它仍将继续出现在该列表中。
对于密码问题,您可以在找到受保护或其他应用程序时启动您的活动。
android.app.usage
软件包。https://developer.android.com/reference/android/app/usage/package-summary.html - Plo_Koonclass CheckRunningActivity extends Thread{
ActivityManager am = null;
Context context = null;
public CheckRunningActivity(Context con){
context = con;
am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
}
public void run(){
Looper.prepare();
while(true){
// Return a list of the tasks that are currently running,
// with the most recent being first and older ones after in order.
// Taken 1 inside getRunningTasks method means want to take only
// top activity from stack and forgot the olders.
List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);
String currentRunningActivityName = taskInfo.get(0).topActivity.getClassName();
if (currentRunningActivityName.equals("PACKAGE_NAME.ACTIVITY_NAME")) {
// show your activity here on top of PACKAGE_NAME.ACTIVITY_NAME
}
}
Looper.loop();
}
}
您可以获取当前运行的Activity
,并检查此Activity
是否对应于电子邮件
应用程序。
在应用程序
启动时(或设备启动时),运行CheckRunningActivity
线程
。
new CheckRunningActivity().start();
更新:
这个类需要android.permission.GET_TASKS
权限,因此将下一行添加到清单文件中:
<uses-permission android:name="android.permission.GET_TASKS" />
Looper.loop()
语句看起来永远不会被执行,因为while(true)
循环永远不会结束。这是一个错误吗? - Sam我认为并且希望这是不可能的。考虑到恶意软件会多么容易地滥用这种功能。你可以监听针对你的意图和广播的意图,但启动应用程序不应该是广播事件。
你可能能够做的是替换启动器,只有在用户同意的情况下才能进行。
getRunningTasks()
在Android L中已被弃用。
要获取应用程序使用统计信息,您可以使用UsageStats类,该类位于android.app.usage包中。
新的应用程序使用统计API允许应用程序开发人员收集与应用程序使用相关的统计信息。此API提供比已弃用的getRecentTasks()方法更详细的使用信息。
要使用此API,您必须首先在清单文件中声明android.permission.PACKAGE_USAGE_STATS
权限。用户还必须通过设置 > 安全性 > 具有使用权限的应用程序
启用此应用程序的访问权限。
这里是一个基本的应用程序示例,演示如何使用应用程序使用统计API让用户收集与应用程序使用相关的统计信息。
更现代的答案(2022年11月):
这可以通过新的应用使用API来处理。
系统会按每个应用程序收集使用数据,并在每日、每周、每月和每年间隔上汇总数据。系统保留此数据的最长时间如下:
每日数据:7天 每周数据:4周 每月数据:6个月 每年数据:2年 对于每个应用程序,系统记录以下数据:
应用程序上次使用的时间
应用程序在该时间间隔内前台运行的总时长(按天、周、月或年计算)
时间戳捕获组件(由包和活动名称标识)何时在一天内移至前台或后台
时间戳捕获设备配置更改(例如,当设备方向因旋转而改变时)
可以使用后台服务来使用上述API不断监视特定应用程序的时间戳更新,以了解它们何时移至前台。
注:似乎从Android 5/6/7及更高版本开始,您不能读取有关其他应用程序的信息,包括它们的状态和日志。我相信这使得接受的答案不再有效。如果有人可以确认这一点,请在下面发表评论!此外,由@Veaceslav Gaidarji建议使用的getRunningTasks函数现已过时。