android怎么从一个activity获取另一个activity的信息

android怎么从一个activity获取另一个activity的信息,第1张

使用Broadcast广播即可

android系统中,BroadcastReceiver的设计初衷就是从全局考虑的,可以方便应用程序和系统、应用程序之间、应用程序内的通信

在获取消息activity中建立BroadcastReceiver内部类,并且注册广播

示例代码如下

//接受消息的activity

public class MainActivity extends Activity {

private InnerReceiver receiver = new InnerReceiver();

@Override

protected void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutactivity_main);

}

@Override

protected void onRestart() {

superonRestart();

//注册广播

IntentFilter filter = new IntentFilter("test");

registerReceiver(receiver, filter);

}

@Override

protected void onStop() {

superonStop();

取消广播

unregisterReceiver(receiver);

}

public class InnerReceiver extends BroadcastReceiver{

@Override

public void onReceive(Context context, Intent intent) {

//使用intent获取发送过来的数据

String msg = intentgetStringExtra("msg");

}

}

}package comexampledemo;

import androidappActivity;

import androidcontentIntent;

import androidosBundle;

import androidviewView;

import androidviewViewOnClickListener;

import androidwidgetButton;

import androidwidgetEditText;

//发送消息的activity

public class SendActivity extends Activity {

private Button btn;

private EditText text;

@Override

protected void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutactivity_main);

btn = (Button)findViewById(Ridbutton);

text = (EditText)findViewById(Ridtext);

btnsetOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent("test");

intentputExtra("msg", textgetText()toString());

sendBroadcast(intent);

}

});

}

}

Intent没有这种方法,自己把类名作为StringExtra放入Intent里面,取出来再判断呗。“想记录下来是从哪个activity跳转来的”跟Android的设计理念有点相背离吧。

最开始考虑的是使用申请悬浮窗权限d出dialog,发现很多问题与要动态申请权限。最终放弃这种了,采用了另一种通过获取当前的activity来显示d窗,

具体实现方案如下, 

1在application的oncreate()注册监听activity生命周期

在onActivityResumed获取到activity

2在你的showDialog里面判断mContext不为空显示d窗dialog。这样的话,你可以在application实现单例后调用showDialog方法。

我这边使用到这样的方式是因为业务需求,在每次调用接口前需要获取到一次消息d窗提醒接口,采用这种方式就可以快速在调用接口的时候实现任意activityd窗提醒功能。

众所周知,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中获取

以上就是关于android怎么从一个activity获取另一个activity的信息全部的内容,包括:android怎么从一个activity获取另一个activity的信息、我在传入的activity如何得的intent是从哪个activity传来的、如何快速实现全局d窗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9721652.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存