我想只根据某些条件激活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按钮显示。
答案 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" />
...
必须从主线程调用所有公共方法。