这篇文章主要为大家详细介绍了机器人开发过程中,关于获取当前活动的一些思考,感兴趣的小伙伴们可以参考一下
在机器人开发过程中,我们有时候需要获取当前的活动实例,比如弹出对话操作,必须要用到这个。关于如何实现由很多种思路,这其中有的简单,有的复杂,这里简单总结一下个人的一些经验吧。
反射
反射是我们经常会想到的方法,思路大概为
获取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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。