我在同一个应用程序中有两个Activity A和Activity B活动,他们需要能够相互调用方法。需要在开始时与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 Map的代码,它是一个片段。
当我点击MapsActivity(活动A)中的菜单选项时,我希望能够通过引用MapsActivity(活动A)启动myBluetoothActivity(活动B)或启动myBluetoothActivity然后能够设置对myBluetoothActivity内部调用者的引用(但是这个选项需要引用MapsActivity中的BluetoothActivity,或者有一些方法从intent中获取已启动的活动)。
//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)直接通过对B内部的活动A的引用来访问调用者活动(活动A),或者试图从启动它的意图中获取对B的引用。活动A.我试图获得对它的引用,因此我可以将它用于通信/方法调用/成员变量和UI修改目的。
注意:1。BluetoothActivity和MapsActivity不可串行化。我尝试将其序列化,然后将其添加到Intent中的extras Bundle中,它只是崩溃说由于BroadCastReciever而无法序列化。因为这也涉及WIFI。我非常考虑将其与未来版本中的BluetoothActivity分开。
我也认为,除了我的MapsActivity类之外,活动B永远不会被其他任何东西启动。
我也是Kotlin的新手,但我知道Java。
当我尝试使用界面时,我导致了StackOverflow错误,我不明白为什么。
我已经在网站上阅读了Intents的文档。
我在这里做了一些研究,上面给了我这些想法。我不知道如何实施它们。
答案 0 :(得分:0)
您使用的是错误的方法。解决方案需要比您想象的更多的工作。正确的方法是:
首先,要意识到活动A和活动B(以及任何其他活动)这些活动是特定于您的应用程序的活动,并且您希望在它们之间建立直接通信。
其次,要意识到您正在尝试获取当前(或上一个)活动的上下文。上下文将有助于提供参考。
第三,您可以通过扩展所需的类来创建自己的Activity和Application类。 Application类是用于活动的低级类。
从这里开始,您将能够使用getApplicationContext(),它将返回您的自定义Application类。
设计:您必须在CustomApplication类内部跟踪对所需活动的引用。从那里你要做的就是将getApplicationContext()强制转换为CustomApplication类,然后调用访问Activity的方法。如果要访问您为其“类型”创建的特定活动的某些实例,则必须转换您的活动。例如:
MapsActivity mact = (MapsActivity)(((MyApplication)(this.getApplicationContext())).getCurrentActivity())
您当然必须注意,必须已创建此活动(已调用onCreate方法)才能返回当前活动。当然,对于活动的其他生命周期方法也是如此,因为您将创建一个baseActivity来处理这些,并且您还将拥有一个应用程序生命周期来帮助解决这个问题。
回答这个问题:“如何在android中获取当前的前台活动上下文?”我转向StackOverflow并找到了用户:gezdy的回答正是我所需要的:How to get current foreground activity context in android?。
(BEGIN QUOTATION来自: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); } }
因此,现在不是为您的活动扩展Activity类,而是 扩展MyBaseActivity。现在,您可以从中获取当前的活动 应用程序或活动上下文:
Activity currentActivity = ((MyApp)context.getApplicationContext()).getCurrentActivity();
(报价结束:盖泽迪)
注意:所有代码都是用java编写的。