通过参考来电者或被叫者在两个Android活动之间进行通信

时间:2018-05-22 06:55:32

标签: java android android-fragments kotlin communication

我在同一个应用程序中有两个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分开。

  1. 我也认为,除了我的MapsActivity类之外,活动B永远不会被其他任何东西启动。

  2. 我也是Kotlin的新手,但我知道Java。

  3. 当我尝试使用界面时,我导致了StackOverflow错误,我不明白为什么。

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

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

1 个答案:

答案 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编写的。