我刚刚开始学习这个平台,我刚开始开发一个简单的Android应用程序.
我正在使用带有ADT插件0.9.6的Eclipse IDE.
我需要知道是否可以查看Activity与任务相关联的堆栈?
有没有办法通过DDMS工具或通过任何其他技术?
基本上我需要的是能够看到任务的堆栈活动,以确保应用程序按预期运行.
我知道通过在Intent对象中使用标志以及通过<activity>元素的某些属性,可以在某种程度上控制任务行为.
然而,拥有一种工具会很好 - 特别是在调试模式下 - 这样可以让开发人员直接看到Activity堆栈.
谷歌似乎最终关闭了获取当前前台应用程序包的所有大门.
在Lollipop更新之后,getRunningTasks(int maxNum)由于这个答案,我使用此代码从Lollipop获取前台应用程序包:
final int PROCESS_STATE_TOP = 2;
RunningAppProcessInfo currentInfo = null;
Field field = null;
try {
field = RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception ignored) {
}
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = am.getRunningAppProcesses();
for (RunningAppProcessInfo app : appList) {
if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
app.importanceReasonCode == 0 ) {
Integer state = null;
try {
state = field.getInt( app );
} catch (Exception ignored) {
}
if (state != null && state == …Run Code Online (Sandbox Code Playgroud) 我们所知道的通常(在实践中任何)防病毒应用程序在卸载之前用于触发简单的对话框,例如:"你要卸载应用程序,你确定吗?" - "是/否".
是的,我知道我可以使用intent-filter拦截包删除意图,例如:
<activity
android:name=".UninstallIntentActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DELETE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="package" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
但问题很简单,这会拦截任何删除请求,而且这会触发我的应用程序和库存安装程序之间的选择器对话框.因此,如果用户将选择库存安装程序 - 我将无法做任何事情.
我的目标不是阻止用户卸载我的应用程序,而只是回滚我的应用程序所做的更改.
从这些防病毒应用程序中学习我发现这种操作是可行的,所以请帮助我并解释它是如何可能的?
更新
由于有些人不相信它是真的 - 我会参考Avast移动安全:
Anti-Theft通过各种自我保护技术伪装其组件来保护自己免于卸载.
另一个例子:适用于Android的卡巴斯基互联网安全 - 这是卸载它的特殊程序,需要输入密码.
无论如何,这意味着有办法拦截卸载程序,以防止卸载或完成一些最终工作.
在Android L中,Google已禁用getRunningTasks.现在它只能返回自己的应用程序任务和主启动器.我再也无法获得其他应用程序任务了.我们的应用需要该方法来确定当前的顶级应用.任何人都有另一种方法来做到这一点?
我在谷歌搜索过,除此之外没有其他相关主题:https: //code.google.com/p/android-developer-preview/issues/detail?id = 29
我尝试使用此PackageManager方法启用和禁用广播接收器:
setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Run Code Online (Sandbox Code Playgroud)
广播接收器在清单中注册.接收器工作正常,但当我尝试禁用它时,它仍然接收广播消息.当我通过"android:enabled ="false""禁用清单中的接收器时,接收器没有收到任何东西,但我无法启用它.
我从服务中调用该方法.
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName componentName = new ComponentName("com.app",
".broadcast_receivers.OnNetworkChangedReceiver");
pm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Run Code Online (Sandbox Code Playgroud)
Android清单:
<receiver android:name=".broadcast_receivers.OnNetworkChangedReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
收件人
public class OnNetworkChangedReceiver extends BroadcastReceiver {
private static final String TAG = "OnNetworkChangedReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "in OnNetworkChanged");
}
}
Run Code Online (Sandbox Code Playgroud)
我昨天也从一个Activity中调用了这个方法.我认为它有效,但今天没有任何作品了.可能是因为我昨天误解为禁用接收器的意图(android.net.conn.CONNECTIVITY_CHANGE)有时会有很大的延迟吗?
PackageManager的方法是正确的方向还是想法中存在基本错误?
非常感谢,斯文
我正在创建一个app lock应用程序.如何在棒棒糖中获得当前的运行任务?getRunningTaskinfo方法在lollipop API中已弃用,那么如何克服这个问题呢?
我想为Android平台编写一个服务,当前台活动发生变化时会通知该服务.基本上,只有在顶级活动发生变化时,服务才能执行某些任务.有什么方法可以订阅并在发生此类事件时收到通知吗?或者没有可能,服务应不时轮询正在运行的活动列表并检查前台活动是什么?不是更好的解决方案......
我正在尝试确定用户当前可见的应用程序.为此,我使用该activityManager.getRunningAppProcesses()方法.
我知道Android 5.1.1不支持该方法 - 这没关系.
一开始它就像魅力一样,我正在迭代RunningAppProcessInfos列表并检查重要性.
tl; dr获取当前前台进程和防止错误postives的正确方法是什么?如何完成列表的顺序 - API说它没有指定.有没有办法正确订购它们?
我做了什么:
不幸的是,ActivityManager返回的列表在每个设备上都是不同的.某些设备返回具有重要性100(即FOREGROUND)的多个信息,即使该过程当前不可见.
这引起了我有很多误报的问题.例如,我每次用facebook测试它并创建一个吐司,每次facebook都在前台.我切换到Home,所以我的启动器应该是前台进程.这是10秒之后,在那之后,facebook又重新出现在列表中的FOREGROUND(它不是开放也不可见)而且我得到了误报.
我认识到有些设备按照最近的流程排序列表.所以我决定尝试以下方法:
ActivityManager.RunningAppProcessInfo appProcess = appProcesses.get(0);
final String processName = appProcess.processName;
final String packageName = removeProcessSuffix(processName);
if (appProcess.importance == FOREGROUND || appProcess.importance == VISIBLE){
//do something, like the toast
}
Run Code Online (Sandbox Code Playgroud)
使用appProcesses.get(0); 我只检查第一个元素,然后bug就消失了.再也没有误报了.
但是,现在在某些设备上,我根本不再获得前台进程.因为他们没有以任何方式订购列表.例如,一些4.2索尼智能手机是一些候选人.我得到了列表,但当前可见的进程是索引11左右.
我不知道该怎么做,以获得当前的前台进程,没有误报.
获取当前前台进程并防止错误假设的正确方法是什么?如何完成列表的顺序 - API说它没有指定.有没有办法正确订购它们?
谢谢!
我有一个非常有趣的问题.
我的印象是当我的应用程序使用麦克风时,Android系统进程(如传入或传出呼叫)需要麦克风,我的应用程序无需任何考虑即可释放它.
但我想这不再是问题,因为我收到的抱怨很少,当使用应用程序并且有来电时,通话中的另一方听不到.
是否有任何方法可以确保每当系统进程请求麦克风释放时?