Как инициализировать CastContext вне метода onCreate

Я хотел бы активировать функцию Cast только по определенным критериям, поэтому мне не нужна логика Cast в моем onCreate. У меня есть метод setupCast со следующим кодом:

private void setupCast(String appId) {
    if (appId != null) {
        Log.d(TAG, "Setting up Cast...");
        setupCastListener();
        CastOptionsProvider.setAppId(appId);
        mCastContext = CastContext.getSharedInstance(_movieActivityContext);
        mCastContext.registerLifecycleCallbacksBeforeIceCreamSandwich(this,      _savedInstanceState);
        mCastSession = mCastContext.getSessionManager().getCurrentCastSession();
        mCastContext.getSessionManager().addSessionManagerListener(
                mSessionManagerListener, CastSession.class);
        mediaRouteMenuItem = CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), _menuForChromecastButton, R.id.media_route_menu_item);
    }
}

Идентификатор получателя приложения передается через HTTP-вызов, и если appId имеет значение null, не запускайте Cast. Проблема, с которой я сталкиваюсь, заключается в том, что моя кнопка Cast не отображается при инициализации mCastContext таким образом.

Однако, если я двигаюсь только:

mCastContext = CastContext.getSharedInstance(_movieActivityContext);

В моем методе onCreate и оставить все остальное как есть, появится кнопка Cast.


person Luka    schedule 02.08.2016    source источник


Ответы (1)


Вы можете использовать onStart(android.content.Intent, int , межд.). Вызывается системой каждый раз, когда клиент явно запускает службу, вызывая startService(Intent), предоставляя предоставленные аргументы и уникальный целочисленный токен, представляющий запрос на запуск. Не вызывайте этот метод напрямую.

// This is the old onStart method that will be called on the pre-2.0
// platform. On 2.0 or later we override onStartCommand() so this
// method will not be called.
@Override
public void onStart(Intent intent, int startId) {
handleCommand(intent);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handleCommand(intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}

Обратите внимание, что система вызывает это в основном потоке вашего сервиса. Основной поток службы — это тот же поток, в котором выполняются операции пользовательского интерфейса для действий, выполняемых в том же процессе. Вы всегда должны избегать остановки цикла событий основного потока. При выполнении длительных операций, сетевых вызовов или интенсивного дискового ввода-вывода следует запускать новый поток или использовать AsyncTask.

Чтобы правильно инициализировать CastContext, приложение должно иметь класс, реализующий интерфейс OptionsProvider:

package com.example.app;

public class CastOptionsProvider implements OptionsProvider {
@Override
public CastOptions getCastOptions(Context appContext) {
...
}
}

и укажите его полное имя класса в AndroidManifest.xml с ключом OPTIONS_PROVIDER_CLASS_NAME_KEY

..

...
<meta-data
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="com.example.app.CastOptionsProvider" />
...

Все общедоступные методы должны вызываться из основного потока.

person Android Enthusiast    schedule 03.08.2016