相关疑难解决方法(0)

如何获取android中的当前前台活动上下文?

每当我的广播被执行时,我想向前台活动显示警报.

android android-activity

156
推荐指数
8
解决办法
27万
查看次数

查看任务的活动堆栈

我刚刚开始学习这个平台,我刚开始开发一个简单的Android应用程序.

我正在使用带有ADT插件0.9.6的Eclipse IDE.

我需要知道是否可以查看Activity与任务相关联的堆栈?

有没有办法通过DDMS工具或通过任何其他技术?

基本上我需要的是能够看到任务的堆栈活动,以确保应用程序按预期运行.

我知道通过在Intent对象中使用标志以及通过<activity>元素的某些属性,可以在某种程度上控制任务行为.

然而,拥有一种工具会很好 - 特别是在调试模式下 - 这样可以让开发人员直接看到Activity堆栈.

android android-activity

133
推荐指数
8
解决办法
8万
查看次数

Android 5.1.1及更高版本 - getRunningAppProcesses()仅返回我的应用程序包

谷歌似乎最终关闭了获取当前前台应用程序包的所有大门.

在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)

android android-6.0-marshmallow

97
推荐指数
3
解决办法
8万
查看次数

应用程序如何检测到它将被卸载?

我们所知道的通常(在实践中任何)防病毒应用程序在卸载之前用于触发简单的对话框,例如:"你要卸载应用程序,你确定吗?" - "是/否".

是的,我知道我可以使用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 uninstall android-intent

70
推荐指数
3
解决办法
6万
查看次数

getRunningTasks在Android L中不起作用

在Android L中,Google已禁用getRunningTasks.现在它只能返回自己的应用程序任务和主启动器.我再也无法获得其他应用程序任务了.我们的应用需要该方法来确定当前的顶级应用.任何人都有另一种方法来做到这一点?

我在谷歌搜索过,除此之外没有其他相关主题:https: //code.google.com/p/android-developer-preview/issues/detail?id = 29

android android-5.0-lollipop

50
推荐指数
5
解决办法
4万
查看次数

启用和禁用广播接收器

我尝试使用此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的方法是正确的方向还是想法中存在基本错误?

非常感谢,斯文

android broadcastreceiver

41
推荐指数
1
解决办法
4万
查看次数

如何`getTopActivity`名称或获取当前在棒棒糖中运行的应用程序包名称?

我正在创建一个app lock应用程序.如何在棒棒糖中获得当前的运行任务?getRunningTaskinfo方法在lollipop API中已弃用,那么如何克服这个问题呢?

android android-5.0-lollipop

28
推荐指数
5
解决办法
5万
查看次数

如何在前台(顶部)活动(应用程序)更改时收到通知

我想为Android平台编写一个服务,当前台活动发生变化时会通知该服务.基本上,只有在顶级活动发生变化时,服务才能执行某些任务.有什么方法可以订阅并在发生此类事件时收到通知吗?或者没有可能,服务应不时轮询正在运行的活动列表并检查前台活动是什么?不是更好的解决方案......

service android foreground android-activity

20
推荐指数
1
解决办法
7557
查看次数

使用activityManager.getRunningAppProcesses()获取(实际)前台进程

我正在尝试确定用户当前可见的应用程序.为此,我使用该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 process activity-manager

19
推荐指数
1
解决办法
1571
查看次数

Android内置麦克风发布问题

我有一个非常有趣的问题.

我的印象是当我的应用程序使用麦克风时,Android系统进程(如传入或传出呼叫)需要麦克风,我的应用程序无需任何考虑即可释放它.

但我想这不再是问题,因为我收到的抱怨很少,当使用应用程序并且有来电时,通话中的另一方听不到.

是否有任何方法可以确保每当系统进程请求麦克风释放时?

android microphone

19
推荐指数
1
解决办法
794
查看次数