两个 Android 活动之间的通信,通过引用调用方或被叫方



我在同一应用程序中有两个活动活动 A 和活动 B,它们需要能够相互调用方法。A 需要在开始时与 B 通信(可能请参阅下面的"代码")。

B将在 A 上调用很多方法(这意味着我无法使用 startActivityForResult 方法进行通信,因为这会关闭 B(活动 B 是蓝牙客户端和服务器,因为它是点对点应用程序))。我确实使用 startActivityForResult 来启动 B 以获得比结果更多的终止信号。

活动 A 使用SupportMapFragment,而活动 B 不能是片段,因为我希望能够从 B 切换到 A,然后再也不使用 B。

最初,我从一个活动开始,并尝试使用ViewFlipper在视图之间切换,并且只调用setContentView(R.layout.my_layout_A)或setContentView(R.layout.my_layout_B)。当然,这个片段给双方都带来了很多问题。

使用片段令人困惑。SupportMapFragment是Google地图的代码,它是一个片段。

当我单击MapsActivity(活动A)中的菜单选项时,我希望能够启动myBluetoothActivity(活动B)并引用MapsActivity(活动A)或启动myBluetoothActivity,然后能够在myBluetoothActivity中设置对调用方的引用(但此选项需要引用MapsActivity中的蓝牙活动或有某种方式从意图中获取启动的活动)。

//the following code is in Kotlin, but this can easily be converted over to java:
//option A: (pass it inside of the constructor)
var mbta:myBluetoothActivity = myBluetoothActivity(this)
//line for intent that I am unsure of
//intent so that I can start the activity with the pointer to the caller already passed into the new activity
startActivity(mbta)
//option B: (set this reference after obtaining a reference from intent):
var mintent:Intent = Intent(this.applicationContext, myBluetoothActivity::class.java)
startActivity(mintent)
//obtain the reference to the BluetoothActivity from the intent (NOT SURE HOW TO DO THIS???)
mbta.setCallerReference(this)

如何通过两个活动之间的引用来完成两个活动之间的这种通信?我应该使用接口进行通信吗?如果我应该使用它,(我确实尝试过)我应该怎么做?

换句话说,我正在尝试通过对 B 内部活动 A 的引用直接从(活动 B)访问调用方活动(活动 A),或者试图从活动 A 中启动它的意图获取对 B 的引用。我正在尝试获取对此的引用,因此我可以将其用于通信/方法调用/成员变量和UI修改目的。

注意:1.蓝牙活动和地图活动不可序列化。我尝试序列化它,然后将其添加到意图中的附加捆绑包中,它只是崩溃了,说由于 BroadCastReciever 而无法序列化。因为这也涉及无线网络。我正在高度考虑将其与蓝牙活动分开放在未来的版本中。

  1. 我也假设活动 B 永远不会由我的 MapsActivity 类以外的任何东西启动。

  2. 我也是 Kotlin 的新手,但我了解 Java。

  3. 当我尝试使用接口时,我导致了StackOverflow错误,我不知道为什么。

  4. 我已经阅读了网站上的Intents文档。

  5. 在这里做了一些研究,给了我上面的想法。我不确定如何实施它们。

您使用了错误的方法。该解决方案需要的工作比您想象的要多一些。正确的方法是:

首先,要认识到这些活动 A 和活动 B(以及任何其他活动)是特定于应用程序的活动,您希望在它们之间建立直接通信。

其次,意识到您正在尝试获取当前(或上一个)活动的上下文。上下文将有助于提供参考。

第三,您可以通过扩展所需的类来创建自己的活动和应用程序类。应用程序类是用于活动的低级类。

从这里,您将能够使用 getApplicationContext(),它将返回您的自定义应用程序类。

设计:必须在自定义应用程序类中跟踪对所需活动的引用。从那里,您所要做的就是将 getApplicationContext() 强制转换为您的 CustomApplication 类,然后调用访问 Activity 的方法。当然,如果要访问您创建的特定活动的某些实例,则必须强制转换其"类型"。例如:

MapsActivity mact = (MapsActivity)(((MyApplication)(this.getApplicationContext())).getCurrentActivity())

当然,您必须注意,此活动必须已经创建(已经调用了onCreate方法),才能返回当前活动。当然,活动的其他生命周期方法也是如此,因为您将创建一个 baseActivity 来处理这些方法,并且您还将拥有一个应用程序生命周期来帮助处理这个问题。

要回答以下问题:"如何在 android 中获取当前的前台活动上下文?我转向StackOverflow,发现用户:gezdy的答案正是我所需要的:如何在android中获取当前的前台活动上下文?

(开始引用自:GEZDY)

应管理活动引用。添加 清单文件中的应用程序:

<application
android:name=".MyApp"
....
</application>

您的应用类 :

public class MyApp extends Application {
public void onCreate() {
super.onCreate();
}
private Activity mCurrentActivity = null;
public Activity getCurrentActivity(){
return mCurrentActivity;
}
public void setCurrentActivity(Activity mCurrentActivity){
this.mCurrentActivity = mCurrentActivity;
}
}

创建新活动 :

public class MyBaseActivity extends Activity {
protected MyApp mMyApp;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMyApp = (MyApp)this.getApplicationContext();
}
protected void onResume() {
super.onResume();
mMyApp.setCurrentActivity(this);
}
protected void onPause() {
clearReferences();
super.onPause();
}
protected void onDestroy() {        
clearReferences();
super.onDestroy();
}
private void clearReferences(){
Activity currActivity = mMyApp.getCurrentActivity();
if (this.equals(currActivity))
mMyApp.setCurrentActivity(null);
}
}

因此,现在不是为您的活动扩展活动类,而只是扩展 MyBaseActivity。现在,您可以从以下位置获取当前活动 应用程序或活动上下文如下所示:

Activity currentActivity = ((MyApp)context.getApplicationContext()).getCurrentActivity();

(引文结尾:GEZDY)

注意:所有代码都是用java编写的。

最新更新