`

如何判断android activity是否运行

阅读更多

如何判断android activity是否运行

 

android对于我们来说是一个复杂的且拥有多种逻辑类别的系统。这对于我们来说是一件好事但是也给我们带来处理一个相同问题会带来更多的复杂性。接下来我们会检查activity是否在你的应用中存在
 
介绍
我们会需要一个持续运行的服务,这个服务会从远程站点获取信息或者做类似事情来给我们带来一些特殊利益。在当时我这个服务获取到一些信息并传送到activity中。如果这个activity运行在前端那并没有什么问题,然后我们怎么确定activity运行在前端呢?
这个问题有多重决绝方法,所有的方法都有利有弊。我们将展现所有的处理方法并列出利弊
 
ActivityManager
首先我们关注下ActivityManager(AM)。AM维持了一个运行时任务记录和最上层任务记录。也许AM中最后的一个任务就是我们的兴趣所在

 

public boolean isForeground(String PackageName){
  // Get the Activity Manager
  ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
 
  // Get a list of running tasks, we are only interested in the last one,
  // the top most so we give a 1 as parameter so we only get the topmost.
  List< ActivityManager.RunningTaskInfo > task = manager.getRunningTasks(1);
 
  // Get the info we need for comparison.
  ComponentName componentInfo = task.get(0).topActivity;
 
  // Check if it matches our package name.
  if(componentInfo.getPackageName().equals(PackageName)) return true;
     
  // If not then our app is not on the foreground.
  return false;
}

 

利:你可以直接的得到你需要的信息,但是更准确的说google对于其还有歧义的,google强烈建议你仅在调试模式下使用。
 
利:没有保存任意类型的变量,只是查看了android的任务栈,所以无论在什么原因下没有任何东西会被删除。
 
弊:获取最顶层的应用或许不是最完整的解决方案。因为你的app可能有很多原因造成其不是一个顶端app,但我们依旧会认为他依然在最顶端并按照此推断去处理。
 
弊:google文档明确的指出不要使用这段代码除了在调试或者管理任务接口时,所以这不是一个可靠的方式并且在未来的android版本也将不可靠
 
弊:你必须在manifest配置中增加GET_TASKS的权限,这或许不是那么友好吧
 

 

弊:由于我们没有系统的控制权,所以你将不会知道系统在任何情况下是怎么处理的,所以你只能假设这一切都运行的非常完好,并且在我们的使用者中这一切在任何情况下都没有发生。
 
static variable
从代码层面上,最简单的方法就是使用静态变量,静态变量在现代编码中被使用的非常多且总是备受争议,但是我们依旧在很多地方看到并使用。

 

public class example extends Activity {
    static boolean isActive = false;
     
    @Override
    protected void onStart() {
        super.onStart();
        isActive = true;
    }
     
    @Override
    protected void onStop() {
        super.onStop();
        isActive = false;
    }
}

 利:非常简便的代码

 
利:很难被用户或者android自身回收
 
利:你可以有很高的控制权并很容易的按照你的实现将Activity分类,就如同最上层Activity这么一个分类
 
弊:静态变量等等其他变量是被关联到一个类实例的,这就是意味着只有类加载器加载的类被卸载了这些变量才会被卸载。一般来说只有当应用被杀死后静态变量才会一起被杀死。然后android在一般情况下不会销毁一些老的历史任务。我们需要注意,如果我们申明一个静态Activity或者context,且静态变量存在复杂的引用关系,那么其不会被销毁,更可怕的是可能带来内存泄露问题。所以请确保当你不在需要这些静态变量时,把他们赋值成null,以让垃圾回收机制处理。在我们的例子中并不是一个反面例子,我们只是存储了一个boolean类型的值,这不会带来内存泄露问题,但是你依然需要清楚静态变量会带来什么,这就是为什么网络上市场出现这类讨论的原因。
 
弊:如上的函数并不会一直被调用,所以得不到一个真实的状态。如果一个app崩溃了,其不会调用onStop()函数。你可以通过定义一个默认的异常处理机制来弥补这个问题,并把状态设定成false。可能还有更多的情况我们未控制,但也有其他觉得方法。
 
弊:尽管静态变量在被销毁后,再次初始化可以被赋予他们的默认值,但这也会在某些情况下带来不可预料的情况。例如崩溃
 
shared preferences
和静态变量类似,shared preferences 可以共享其他Activity和service的状态

 

public class example extends Activity {
     
    @Override
    protected void onStart() {
        super.onStart();
         
        // Store our shared preference
        SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
        Editor ed = sp.edit();
        ed.putBoolean("active", true);
        ed.commit();
    }
     
    @Override
    protected void onStop() {
        super.onStop();
         
        // Store our shared preference
        SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
        Editor ed = sp.edit();
        ed.putBoolean("active", false);
        ed.commit();
         
    }
}

 利:shared preferences 不会被android销毁

 
利:shared preferences 不会被重置成默认值
 
利:你可以有很高的控制权并很容易的按照你的实现将Activity分类,就如同最上层Activity这么一个分类
 
弊:shared preferences可以被用户手动清除,这种情况你是无法知道的,这会让你的系统出问题。
 
弊:如上的函数并不会一直被调用,所以得不到一个真实的状态。如果一个app崩溃了,其不会调用onStop()函数。你可以通过定义一个默认的异常处理机制来弥补这个问题,并把状态设定成false。可能还有更多的情况我们未控制,但也有其他觉得方法。
 
 
结论
 
我们更喜欢使用shared preferences。其有最可靠的状态信息,
可以减少app被销毁带来的问题,不需要更多的权限,当我们的Activity在最上层是他给我们更多的决定权,去做一些事情。
 
 
异常处理
 
在上述几个章节提到的错误处理问题,你可以通过创建一个默认的异常处理机制来处理,你可以把这段函数放在onCreate()的最前面

 

 

final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
 
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread thread, Throwable throwable) {
                // fix our issues for static variables
                isActive = false;  
                 
                // fix our issues for sharedpreferences
                SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
                Editor ed = sp.edit();
                ed.putBoolean("active", false);
                ed.commit();
                 
                // Handle everthing else
                defaultHandler.uncaughtException(thread, throwable);
            }
        });

 

分享到:
评论

相关推荐

    Android判断栈顶activity;打印当前最顶层的activity类名;采用服务后台运行获取当前activity类名;

    Android判断栈顶activity;打印当前最顶层的activity类名;采用服务后台运行获取当前activity类名;是一个demo App,使用Android studio工具打开,有需要的可以自行下载;

    Android activity-alias别名的使用

    Activity别名可以通过设置enabled属性来控制是否启用。例如,你可以根据需求动态地禁用或启用别名,这在更新应用功能或者切换不同版本时非常有用。例如,将enabled设为"false"将禁用别名: ```xml &lt;activity-alias ...

    Android Activity 实时模糊效果

    在Android开发中,Activity是应用程序的基本构建块,用于表示用户界面。实时模糊效果是一种常见的设计手法,用于在某个视图或Activity背后创建一种半透明、模糊的视觉效果,以突出显示前景内容。这种效果通常用于...

    Android Activity学习笔记

    Android Activity学习笔记 Android Activity是Android系统中最基本的组件之一,它负责处理用户交互和显示用户界面。本文将深入讲解Activity的生命周期、Activity之间的数据交互、Activity启动模式、Task和BackStack...

    浅谈Android的Activity运行流程(生命周期)

    ### 浅谈Android的Activity运行流程(生命周期) #### 概述 在Android开发中,`Activity`是四大组件之一,负责处理与用户交互相关的界面显示。每个`Activity`都有其特定的生命周期,这一周期决定了应用如何响应...

    android activity的一些特效

    通过在AndroidManifest.xml中为Activity设置`android:hardwareAccelerated="true"`,可以利用设备的GPU进行渲染,使特效运行更流畅。 以上只是一部分可能在"Activityzhuanghuantexiao"中涉及的特效,实际的源代码...

    Android 中从activity1跳转到activity2再回到activity所经历的生命周期

    ### Android 中从Activity1跳转到Activity2再回到Activity1所经历的生命周期 在Android开发过程中,理解Activity的生命周期对于管理界面状态、处理用户交互以及响应系统事件至关重要。本文将详细解析从一个Activity...

    Android activity动画案例

    在Android开发中,Activity是应用程序的基本构建块,用于展示用户界面和处理用户交互。Activity间的切换是用户体验的重要组成部分,为了使应用更具吸引力和流畅性,Android提供了丰富的动画机制来美化这种切换过程。...

    Android的Activity周期测试

    在Android应用开发中,Activity是用户界面的主要组件,它负责与用户进行交互。理解Activity的生命周期至关重要,因为这直接影响到应用程序的行为和性能。本篇文章将深入探讨Android的Activity周期,并通过实际测试来...

    Android 动态设置程序activity背景图片源码

    在Android开发中,动态设置Activity背景图片是一项常见的需求,它能为用户带来更丰富的交互体验。本文将深入探讨如何通过源码实现这一功能,并提供一个实际的案例——wallTest。 首先,我们需要理解Android中的...

    Android 判断某个Activity 是否在前台运行的实例

    在Android开发中,有时我们需要知道某个特定的Activity是否正在前台运行,这可能涉及到用户交互的判断、消息推送的控制或者优化应用性能等多个方面。本文将详细介绍如何在Android中实现这一功能,通过一个具体的实例...

    Android Activity动态加载Fragment

    本示例"Android Activity动态加载FragmentDemo"将深入探讨如何在运行时动态地在Activity中添加、替换或移除Fragment。 首先,Fragment的生命周期与Activity紧密关联。当Activity的状态改变时,其包含的Fragment也会...

    Android之Activity应用小例子

    在Android开发中,Activity是应用程序的基本构建块,它代表了用户可以与之交互的界面。Activity通常用于展示屏幕上的信息,接收用户输入,并处理相关的事件。在这个“Android之Activity应用小例子”中,我们将深入...

    Android-Service与Activity传值

    `Service`用于在后台执行长时间运行的任务,而`Activity`则负责用户界面交互。在某些场景下,我们可能需要在`Service`和`Activity`之间传递数据,比如`Service`执行完一些操作后,将结果传递给`Activity`进行展示。...

    android activity之间跳转的示例程序

    初学者可以通过阅读和运行这些代码,更深入地理解Activity间的跳转过程。 此外,还可以利用Intent的其他功能,如传递数据、启动服务、广播等。在实际开发中,熟练掌握Activity和Intent的使用,是构建功能丰富且用户...

    Android锁屏状态下显示Activity

    在Android系统中,有时开发者需要在用户设备锁屏的状态下显示特定的Activity,以提供更为直接的用户交互体验。比如来电提醒、紧急通知或者闹钟等。这些功能的实现涉及到了Android系统的电源管理、窗口管理和通知策略...

    android activity示例

    在Android开发中,Activity是应用程序的基本构建块,它代表用户界面的一个屏幕。Activity生命周期的理解对于任何Android开发者来说至关重要,因为它涉及到应用如何响应系统事件,如屏幕旋转或内存不足的情况。让我们...

    Android判断Activity是否在最上层的方法

    在Android应用开发中,了解如何判断一个Activity是否在最上层是非常重要的,因为这有助于我们进行更精细的用户交互控制和应用逻辑管理。通常,一个Activity位于最上层意味着它是当前用户可见并交互的界面。以下我们...

    详解 Android 的 Activity 组件

    ### 详解 Android 的 Activity 组件 #### 概述 在Android开发中,`Activity`是四大组件之一,它是用户界面的基础单位,也是Android应用中最重要的组成部分之一。一个Android应用通常由多个`Activity`组成,每个`...

    android native activity项目

    本项目"android native activity"提供了创建和运行一个基本Native Activity的实例,适合对Android原生编程感兴趣的开发者学习。 首先,Native Activity是Android系统框架的一部分,由Android的libnative_activity....

Global site tag (gtag.js) - Google Analytics