Передача Bluetooth-соединения к новой активности - PullRequest
0 голосов
/ 17 февраля 2011

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

(1) Сейчас я внедряю в приложение bluetooth-сканер, и я хотел бы иметь возможность редактировать настройки и устанавливать соединение bluetooth на основном Activity и передавать егосоединение (возможно, через Bundle или Parcelable?) с другими операциями.

Я искал Bundle как способ передачи соединения, но, похоже, он принимает только примитивные и базовые типы в качестве значений.Я заметил, что Intent.putExtra (String, Parcelable) был доступен, но Parcel немного смутил меня.Каков наилучший способ реализовать это, или это вообще возможно?

некоторый соответствующий код:

//subclass definitions for the Runnables which start the applications in their own threads
private final Handler smsHandler = new Handler();
private final Handler smsOutHandler = new Handler();

private final Runnable smsIntentRunnable = new Runnable() {
    public void run() {
        Intent smsIntent = new Intent(smsMobile.this, smsActivity.class);
        startActivity(smsIntent);
    }
};

private final Runnable smsOutIntentRunnable = new Runnable() {
    public void run() {
        Intent smsOutIntent = new Intent(smsMobile.this, smsOutActivity.class);
        startActivity(smsOutIntent);
    }
};

//button listeners located in onCreate(), which start the Activities
newTicket.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        smsHandler.post(smsIntentRunnable);
    }
});

updateTicket.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        smsOutHandler.post(smsOutIntentRunnable);
    }
});

(2) Могу ли я также передать соединение с базой данных?Я понимаю, что SQLiteOpenHelper должен быть разделен на подклассы, что может усложнить IPC, но подумал, что это все еще возможно как-то?

Ответы [ 2 ]

1 голос
/ 16 июля 2013

Я переписываю приложение, чтобы разделить службу bluetooth между двумя действиями.Ранее я только что решил проблему, выполнив инициализацию службы bluetooth как общедоступного объекта в начальном действии (где служба настроена и из которой запускаются другие действия), а затем вызвав .read () и .write () функции государственной службы от новой деятельности.Это прекрасно работает для записи, но это немного обременительно для чтения (я должен запускать поток каждый раз, когда ожидаю возвращения данных, сидеть и ждать данных).Я перенес все свои другие проекты, чтобы выполнять определенные действия, выполняемые из обработчика службы Bluetooth, когда служба считывает определенные ключевые данные (например, обновлять температуру в пользовательском интерфейсе при получении закодированных данных о температуре).Чтобы иметь возможность более элегантного чтения с обоими действиями, я добавил новую функцию в свой сервис Bluetooth:

/**
 * Change the handler (route handler info to new activity). */
public synchronized void newHandler(Handler handle) {
    mHandler = handle;
}

Затем вызовите эту функцию, чтобы переназначить новый обработчик из нового действия, когда новое действиезапускается (например, «StartingActivity.mBTService.newHandler (NewActivityHandler);»). Конечно, при возврате обратно в StartingActivity необходимо соответствующим образом переназначить обработчик; -)

К моему удивлению, он работает безвсе накладные расходы на то, чтобы сделать службу Bluetooth единичным, разлагаемым объектом или глобальной службой через приложение (ни одно из которых я не смог успешно закодировать).

Я собираюсь провести более тщательное тестирование,но, надеюсь, это кому-нибудь поможет (когда я что-то верну, я многому научился у этого сообщества)!

0 голосов
/ 17 февраля 2011

Существует несколько вариантов обмена данными между действиями и службами .

Обновление: , чтобы немного расширить вашу ситуацию:

IPC / Parcelable требуется только тогда, когда код выполняется в отдельных процессах. В манифесте необходимо указать, чтобы код выполнялся в отдельных процессах: http://developer.android.com/guide/topics/fundamentals.html#procthread

  1. В вашем случае, я полагаю, ваши действия выполняются в одном и том же процессе, поэтому вы можете просто использовать собственный класс Application для хранения / обмена этими данными. Убедитесь, что это synchronized, если вы обращаетесь к нему из разных потоков. В качестве альтернативы вы можете использовать любой другой подход, указанный в первой ссылке.

  2. Конечно, вы можете передать соединение с базой данных в рамках одного и того же процесса, так как это одно из Java-приложений. Но вы не можете передать его через IPC между процессами, потому что все классы должны реализовывать Parcelable, чтобы проходить через IPC , и, AFAIK, SQLiteDatabase не реализует parcelable (классы, взаимодействующие с нативными функциями, как правило, этого не делают) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...