Ian*_*Ian 91 android broadcastreceiver android-intent
我正在尝试开发一个应用程序,防止用户在没有密码的情况下访问指定的应用程序.情景是......
我正在做剩下的事情,只是第2部分令我感到困惑,经过多天阅读广播意图等并试图在我的试验项目中听"android.intent.action.MAIN"等我不能似乎检测到我的应用程序何时启动.
有人可以帮忙吗?我是否正确地寻找新的应用程序广播意图启动,或者我应该阅读系统日志以获取新意图,或者使用本机代码执行某些操作?
任何指针都会有所帮助,即使你无法完全回答它,我也可以做更多的研究.非常感谢.伊恩
M.M*_*agh 34
我想我们可以使用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();
}
Run Code Online (Sandbox Code Playgroud)
并且不要忘记在Manifest文件中添加它的权限.
小智 19
花哨的方法是使用带有定时循环检查的服务
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();
Run Code Online (Sandbox Code Playgroud)
您将浏览该列表以查看手机上正在运行的内容.现在你可以使用id和processName来识别它们,因此对于标准活动来说,这对于自定义活动来说很容易,除非你把它们全部停下来很难辨别......
注意:这不是一个实际上在屏幕上的列表,只是一个正在运行的列表...有点无效你的目标可能但至少你会知道什么时候开始运行......它将继续存在即使在后台也列出.
对于密码问题,您可以在找到受保护的应用程序或其他任何内容时启动您的活动.
Vea*_*rji 12
class 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();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以获得当前运行Activity
并检查它是否Activity
与Email
应用程序相对应.
CheckRunningActivity
Thread
在Application
启动时运行(或在设备启动时运行).
new CheckRunningActivity().start();
Run Code Online (Sandbox Code Playgroud)
更新:
此类需要android.permission.GET_TASKS
权限,因此在Manifest中添加下一行:
<uses-permission android:name="android.permission.GET_TASKS" />
Run Code Online (Sandbox Code Playgroud)
Cod*_*ile 10
主要问题是当Launcher(主屏幕)通常使用显式意图时,您正在尝试侦听隐式意图.
一个隐含的意图是当你想说"有人播放这个视频"时,Android选择一个可以处理这个意图的应用程序.
当您单击主屏幕上的"电子邮件"图标时,会出现明确的意图.它特别告诉Android通过完全限定名称(即com.android.mail或其他)打开该特定应用程序.
AFAIK无法拦截这种明确的意图.这是Android内置的安全措施,没有两个活动可以拥有相同的完全限定的包名.这可以防止第三方克隆应用程序并伪装成该应用程序.如果你想做的事情是可能的,理论上你可以安装一个可以阻止所有竞争对手的应用程序运行的应用程序.
您要做的是违反Android安全模型.
您可以做的一件事是与特定的应用程序开发人员合作,将意图转发给您的安全系统,但这可能不是您想要处理的事情.
getRunningTasks()
在Android L.中已弃用
要获取应用程序使用情况统计信息,您可以使用android.app.usage包中的UsageStats类.
新的App使用统计API允许应用程序开发人员收集与应用程序使用情况相关的统计信息.与不推荐使用的getRecentTasks()方法相比,此API提供了更详细的使用信息.
要使用此API,您必须首先android.permission.PACKAGE_USAGE_STATS
在清单中声明权限.用户还必须通过此应用程序启用访问权限Settings > Security > Apps with usage access
.
这是一个基本的应用程序示例,展示了如何使用App使用统计信息API来让用户收集与应用程序使用情况相关的统计信息.
归档时间: |
|
查看次数: |
71336 次 |
最近记录: |