,,Android开发中关于获取当前Activity的一些思考

,,Android开发中关于获取当前Activity的一些思考

这篇文章主要为大家详细介绍了机器人开发过程中,关于获取当前活动的一些思考,感兴趣的小伙伴们可以参考一下

在机器人开发过程中,我们有时候需要获取当前的活动实例,比如弹出对话操作,必须要用到这个。关于如何实现由很多种思路,这其中有的简单,有的复杂,这里简单总结一下个人的一些经验吧。

反射

反射是我们经常会想到的方法,思路大概为

获取ActivityThread中所有的ActivityRecord

从ActivityRecord中获取状态不是pause的Activity并返回

一个使用反射来实现的代码大致如下

公共静态活动getActivity() {

类activityThreadClass=null

尝试{

activityThreadClass=class。for name(‘安卓。app。活动线程’);

对象活动线程=活动线程类。get方法(“currentActivityThread”).调用(空);

现场活动field=activitythreadclass。getdeclaredfield(“MAC activities”);

活动字段。设置可访问性(true);

映射活动=(映射)活动字段。get(活动线程);

for(对象活动记录:活动。values()){

class activityRecordClass=活动记录。getclass();

field paused field=activityrecordclass。getdeclaredfield(“paused”);

波塞菲尔德。设置可访问性(true);

如果(!波塞菲尔德。获取布尔值(活动记录)){

字段活动field=activityrecordclass。getdeclaredfield(“activity”);

活动字段。设置可访问性(true);

活动Activity=(Activity)活动字段。get(活动记录);

回报活动;

}

}

} catch(ClassNotFoundException e){

e。printstacktrace();

} catch(NoSuchMethodException e){

e。printstacktrace();

} catch(IllegalAccessException e){

e。printstacktrace();

} catch(InvocationTargetException e){

e。printstacktrace();

} catch (NoSuchFieldException e) {

e。printstacktrace();

}

返回空

}

然而这种方法并不是很推荐,主要是有以下的不足:

反射通常会比较慢

不稳定性,这个才是不推荐的原因,安卓框架代码存在修改的可能性,谁要无法100%保证活动,暂停固定不变。所以可靠性不是完全可靠。

Activity基类

既然反射不是很可靠,那么有一种比较可靠的方式,就是使用活动基类。

在活动的简历上方法中,将当前的活动实例保存到一个变量中。

公共类基础活动扩展活动{

@覆盖

受保护的void onResume() {

超级棒。on resume();

MyActivityManager.getInstance().setCurrentActivity(this);

}

}

然而,这一种方法也不仅完美,因为这种方法是基于约定的,所以必须每个活动都继承基础活动,如果一旦出现没有继承基础活动的就可能有问题。

回调方法

介绍了上面两种不是尽善尽美的方法,这里实际上还是有一种更便捷的方法,那就是通过结构提供的回调来实现。

机器人自API 14开始引入了一个方法,即应用的registerActivityLifecycleCallbacks方法,用来监听所有活动的生命周期回调,比如已创建的活动,已恢复的活动等。

所以,一个简单的实现如下

公共类我的应用扩展应用程序{

@覆盖

public void onCreate() {

超级棒。oncreate();

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks(){

@覆盖

已创建活动的公共void(活动Activity,捆绑包savedInstanceState) {

}

@覆盖

公共活动开始时无效(活动Activity){

}

@覆盖

公共活动恢复时作废(活动Activity){

MyActivityManager.getInstance().setCurrentActivity(活动);

}

@覆盖

公共暂停活动时作废(活动活动){

}

@覆盖

公共活动停止时无效(活动活动){

}

@覆盖

activitysaveinstancestate(Activity Activity,Bundle outState)上的公共void {

}

@覆盖

公共活动被破坏时无效(活动Activity){

}

});

}

}

然而,金无足赤人无完人,这种方法唯一的遗憾就是只支持API 14即其以上。不过还在现在大多数设备都满足了这个要求。

为什么是弱引用

可能有人会带着疑问看到这里,我的活动管理器是个什么鬼,好,我们现在看一下这个类的实现

公共类我的活动管理器{

private static my activity manager sin instance=new my activity manager();

私有WeakReferenceActivity scurrentactivitywearref;

私有MyActivityManager() {

}

公共静态我的活动管理器getInstance(){

返回实例

}

公共活动getCurrentActivity() {

活动currentActivity=null

if(scurrentactivitywearref!=null) {

currentActivity=scurrentactivitywakref。get();

}

返回电流活动性

}

公共void setCurrentActivity(Activity Activity){

scurrentactivitywakref=new WeakReferenceActivity(activity);

}

}

这个类,实现了当前活动的设置和获取。

那么为什么要使用弱引用持有Activity实例呢?

其实最主要的目的就是避免内存泄露,因为使用默认的强引用会导致活动实例无法释放,导致内存泄露的出现。

以上就是本文的全部内容,希望对大家学习机器人软件编程有所帮助。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • windowsandroid手机版下载,windowsandroid安装apk
  • windowsandroid手机版下载,windowsandroid安装apk,WindowsAndroid 安装教程详解
  • android调用webview方法,androidwebview是什么,Android 中 WebView 的基本用法详解
  • android传感器高级编程,Android传感器,Android编程之光线传感器用法详解
  • android.app.Dialog,android自定义dialog对话框,Android开发笔记之-Dialog的使用详解
  • android 图片视频轮播框架,androidlayout轮播图,Android实现炫酷轮播图效果
  • android里的viewpager,安卓自定义view流程,Android自定义引导玩转ViewPager的方法详解
  • android里的viewpager,android viewpager详解
  • android里的viewpager,android viewpager详解,Android自定义超级炫酷的ViewPage指示器
  • android调用webview方法,androidwebview是什么
  • android设置控件宽度,android获取屏幕宽度和高度
  • android设置控件宽度,android获取屏幕宽度和高度,Android中获取控件宽高的4种方法集合
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程,android蓝牙简单开发示例教程
  • android菜单栏,android菜单控件
  • 留言与评论(共有 条评论)
       
    验证码: