实例代码如下“
public class MyActivity extends Activity
3 {
4 public void test(){};
5 public void test(int position){}
6 }
7 BaseAdater:
8 public class MyBaseAdapter extends BaseAdapter{
9 MyActivity context;
10 public MyBaseAdapter(MyActivity context){
11 thiscontext = context;
12 }
13 //其他函数中调用MyActivity的方法。
14 contexttest();
15 contexttext(1);
16
实现
获取任务栈
必须添加权限:
<!--获取Activity任务栈 权限-->
<uses-permission android:name="androidpermissionGET_TASKS" />12
具体实现,获取栈以及其中内容:
// 获取activity任务栈
ActivityManager manager = (ActivityManager) getSystemService(ContextACTIVITY_SERVICE);
ActivityManagerRunningTaskInfo info = managergetRunningTasks(1)get(0);
// 类名 uimobileactivityWebsiteLoginActivity
android开发中获取当前的Activity有多种情况;
在Activity中,this就是当前的Activity,例如thisstartActivity。
在Fragment中可以通过 getActivity()来得到当前装载这个Fragment的Activity。
通过Activity堆栈来获取当前显示的这个Activity
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ComponentName cn = amgetRunningTasks(1)get(0)topActivity;
package comtesthellojunit;
import androidosBundle;
import androidappActivity;
import androidviewMenu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
}
}
众所周知,Context的含义是上下文,也就是场景的意思,关于获取全局Context的方法,一般情况是在自定义的Application中写一个,需要的时候直接获取就可以了,下面是代码所示:
private static Context context;
private static Context getContext(){
return context;
}
@Override
public void onCreate() {
superonCreate();
context=thisgetApplicationContext();
thisregisterActivityLifecycleCallbacks(this);
}
上面的代码是写在自定义的Application中的,以后我们需要获取全局Context的时候就用BaseApplicationgetContext()方法即可,请注意,上面的方法只是一般情况下的,就是我们已经进入了这个程序里面,但是就像刚才说的那样,如果不能接触程序逻辑,或者连Application都没有初始化的时候能获取吗,显然不能吧?那是不是就没有办法了?不是滴,经过查看源码,我们发现应用程序的入口里面就提供了获取全部Application的方法,这个类是ActivityThread,这个类也是大名鼎鼎的Android应用程序的主线程,它里面做的事情可多了呢,包括初始化消息循环机制等等,这也是为什么在主线程里面可以直接new
一个Handler的原因,而不用绑定线程的Looper,当然,本文讨论的问题不是Looper,而是全局Context对象,我们发现,ActivityThread有一个方法:
public Application getApplication() {
return mInitialApplication;
}
利用这个方法我们可以获取全局Application对象,当然也就可以获取全局Context对象啦,可问题是ActivityThread是一个隐藏类,怎么办呢,那就反射吧,下面是代码
Class<> clazz = ClassforName("androidappActivityThread");
Field field = clazzgetDeclaredField("sCurrentActivityThread");
fieldsetAccessible(true);
//得到ActivityThread的对象,虽然是隐藏的,但已经指向了内存的堆地址
Object object = fieldget(null);
Logd("[app]", "object=" + object);
Method method=clazzgetDeclaredMethod("getApplication");
methodsetAccessible(true);
Application application=(Application)methodinvoke(object);
Logd("[app]","application="+application);
Logd("[app]","程序的application对象="+getApplication());
测试结果如下:
可以看到成功获取了Application对象,那么获取Context就容易啦,而且我们看到,这样反射获取的跟直接程序调用的结果是一样的,其实这也很好理解,总之,这种方法一般情况下是在特殊的时候使用,比如注入的 *** 作可能使用到,好了,今天的博文就写到这里,有什么疑问提出来,其实ActivityThread还有一个静态方法直接获取application,获取的结果也是这个,都是一样的,大家去试试吧。需要补充的是,这个方法是无敌的,就像标题所说,任何地方,任何时候,任何逻辑,只要程序进入了主线程就能获取,而不是仅仅局限于网上说的在自定义的application中获取
以上就是关于安卓adapter中怎么获取activity全部的内容,包括:安卓adapter中怎么获取activity、如何获取栈中的activity、如何获得当前的activity android等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)