Связь между двумя действиями Android через ссылку на вызывающего или вызывающего абонента - PullRequest
0 голосов
/ 22 мая 2018

У меня есть два действия A и A в одном приложении, и они должны иметь возможность вызывать методы друг для друга.A должен связаться с B в начале (возможно, см. «Код» ниже).

B вызовет много методов для A (это означает, что я не могу использовать метод startActivityForResult для связи, потому что это закроет B(Действие B - это клиент и сервер Bluetooth, потому что это одноранговое приложение)).Я использую 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 (но для этого параметра потребуется наличие ссылки на BluetoothActivity внутри 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)

Как я могу выполнить эту связь между двумя действиями посредством ссылки между этими двумя действиями?Должен ли я использовать интерфейс для общения?Если я должен его использовать (что я и пытался), как я должен?

Другими словами, я пытаюсь получить доступ к активности вызывающего абонента (действие A) из (действия B) напрямую через ссылку на действие Aвнутри B ИЛИ пытаясь получить ссылку на B из намерения, с которого она началась в Деятельности A. Я пытаюсь получить ссылку на нее, поэтому я могу использовать ее для связи / вызова метода / переменной-члена и в целях изменения пользовательского интерфейса.

ПРИМЕЧАНИЯ: 1. BluetoothActivity и MapsActivity НЕ Сериализуемы.Я попытался сериализовать его, а затем добавить в дополнительный пакет в Intent, и он просто упал, сказав, что сериализовать его невозможно из-за BroadCastReciever.Поскольку это также касается WIFI.Который я очень планирую выделить для использования с BluetoothActivity в будущем выпуске.

Я также предполагаю, что действие B. никогда не будет запущено чем-либо, кроме моего класса MapsActivity.

Я также новичок в Kotlin, но я знаю Java.

Когда я пытался использовать интерфейс, я вызвал ошибку StackOverflow, и я понятия не имею, почему.

Я прочитал документацию дляСодержание на сайте.

Я провел здесь некоторое исследование, которое дало мне эти идеи выше.Я не уверен, как их реализовать.

1 Ответ

0 голосов
/ 23 мая 2018

Вы используете неправильный подход.Решение требует немного больше работы, чем вы думаете.Правильный подход заключается в следующем:

Во-первых, осознайте, что эти действия Упражнение A и Упражнение B (и любые другие действия) являются действиями, характерными для вашего приложения, и вы хотите установить прямую связь между ними.

Во-вторых, осознайте, что вы пытаетесь получить контекст текущего (или предыдущего) действия.Контекст поможет служить ссылкой.

В-третьих, вы можете создавать свои собственные классы Activity и Application, расширяя нужные классы.Класс Application является классом низкого уровня, используемым для действий.

Здесь вы сможете использовать getApplicationContext (), который будет возвращать ваш пользовательский класс Application.

Дизайн: Внутри вашего класса CustomApplication вы должны отслеживать ссылки на нужные вам действия.Оттуда все, что вам нужно сделать, это привести 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);
    }
}

Итак, сейчасвместо того, чтобы расширять класс Activity для ваших действий, просто расширьте MyBaseActivity.Теперь вы можете получить текущую активность из приложения или из контекста активности, например:

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

(КОНЕЦ ЦИТАТЫ ОТ: GEZDY)

Примечание: Весь код написан на Javaза этот ответ.

...