2016-08-02 17 views
1

Ich möchte die Cast-Funktion nur aufgrund bestimmter Kriterien aktivieren, daher möchte ich keine Cast-Logik in meinem onCreate. Ich habe eine setupCast Methode, die den folgenden Code hat:So initialisieren Sie CastContext außerhalb der onCreate-Methode

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); 
    } 
} 

Die Anwendung Empfänger-ID wird über einen HTTP-Aufruf übergeben und wenn die appId null ist, nicht Guss starten. Das Problem, das ich habe, ist, dass meine Cast-Schaltfläche nicht angezeigt wird, wenn mCastContext auf diese Weise initialisiert wird.

Allerdings, wenn ich nur bewegen:

mCastContext = CastContext.getSharedInstance(_movieActivityContext);

In mein onCreate Methode und halten alles andere so, wie es ist, zeigt die Cast-Taste nach oben.

Antwort

0

Sie können onStart (android.content.Intent, int, int) verwenden. Wird vom System jedes Mal aufgerufen, wenn ein Client den Dienst explizit aufruft, indem er startService (Intent) aufruft, die angegebenen Argumente bereitstellt und ein eindeutiges ganzzahliges Token angibt, das die Startanforderung darstellt. Rufen Sie diese Methode nicht direkt auf.

// 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; 
} 

Beachten Sie, dass das System dies auf dem Hauptthread Ihres Dienstes aufruft. Der Hauptthread eines Diensts ist derselbe Thread, in dem UI-Vorgänge für Aktivitäten ausgeführt werden, die im selben Prozess ausgeführt werden. Sie sollten immer vermeiden, die Ereignisschleife des Hauptthreads zu blockieren. Bei lang andauernden Vorgängen, Netzwerkaufrufen oder Festplatten-E/A sollten Sie einen neuen Thread starten oder AsyncTask verwenden.

Um richtig CastContext zu initialisieren, muss die Anwendung eine Klasse, die OptionsProvider Schnittstelle implementiert:

package com.example.app; 

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

und seine vollständig qualifizierten Klassennamen mit dem Schlüssel 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" /> 
... 

im AndroidManifest.xml angeben Alle öffentlichen Methoden müssen vom Hauptthread aus aufgerufen werden.