如何在onCreate方法之外初始化CastContext

时间:2016-08-02 21:44:20

标签: java android casting chromecast google-cast

我想只根据某些条件激活Cast功能,所以我不想在onCreate中使用任何Cast逻辑。我有一个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);
    }
}

应用程序接收者ID通过http调用传入,如果appId为null,则不要启动Cast。我遇到的问题是,在以这种方式初始化mCastContext时,我的Cast按钮不会显示。

但是,如果我只移动:

mCastContext = CastContext.getSharedInstance(_movieActivityContext);

进入我的onCreate方法并保持其他所有方式,Cast按钮显示。

1 个答案:

答案 0 :(得分:0)

您可以使用onStart(android.content.Intent,int,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;
}

请注意,系统会在您服务的主要主题上调用此方法。服务的主线程是同一个线程,在该线程中,对于在同一进程中运行的活动进行UI操作。你应该总是避免拖延主线程的事件循环。在进行长时间运行,网络呼叫或重磁盘I / O时,您应该启动新线程或使用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" />
...

必须从主线程调用所有公共方法。