Come posso aprire un frammento di Android in un nuovo process?

L'applicazione che sto attualmente utilizza utilizza un cassetto di navigazione e each scheda apre un nuovo frammento nell'attività (sostituendo l'antico).

Uno di questi frammenti è una scena Unity3D. Fondamentalmente, quello che ho fatto è stato:

  • Come faccio a fare scorrere il mio schermo in Android Eclipse
  • Android - FirebaseApp / Firebase-Initialization non si avvia
  • Applicare ColorFilter a ImageView con ShapedDrawable
  • la colonna _id non esiste
  • Immagine di ritaglio con rilevazione del viso in android
  • Come creare disegni dalla risorsa
    1. esportre il progetto Unity come un'applicazione Android
    2. aprire l'attività che ha dato (che era UnityPlayerNativeActivity)
    3. convertire questa UnityPlayerNativeActivity in un frammento, come mostrato nel codice qui sotto. Ho anche cambiato alcune cose minori nel manifesto.

      import com.unity3d.player.*; import android.app.Fragment; import android.app.NativeActivity; import android.content.res.Configuration; import android.graphics.PixelFormat; import android.os.Bundle; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; public class UnityPlayerNativeFragment extends Fragment { protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code private static final String ARG_SECTION_NUMBER = "section_number"; public static UnityPlayerNativeFragment newInstance(int sectionNumber) { UnityPlayerNativeFragment fragment = new UnityPlayerNativeFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); fragment.setArguments(args); return fragment; } // Setup activity layout @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getActivity().getWindow().takeSurface(null); getActivity().setTheme(android.R.style.Theme_NoTitleBar_Fullscreen); getActivity().getWindow().setFormat(PixelFormat.RGB_565); mUnityPlayer = new UnityPlayer(getActivity()); if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true)) getActivity().getWindow().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1); boolean trueColor8888 = false; mUnityPlayer.init(glesMode, trueColor8888); mUnityPlayer.windowFocusChanged(true); mUnityPlayer.setX((float)-5); View playerView = mUnityPlayer.getView(); return playerView; } // Quit Unity @Override public void onDestroy () { mUnityPlayer.quit(); super.onDestroy(); } // Pause Unity @Override public void onPause() { super.onPause(); mUnityPlayer.pause(); } // Resume Unity @Override public void onResume() { super.onResume(); mUnityPlayer.resume(); } // This ensures the layout will be correct. @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mUnityPlayer.configurationChanged(newConfig); } public void onWindowFocusChanged(boolean hasFocus) { mUnityPlayer.windowFocusChanged(hasFocus); } } 

    Il problema è qui con la function mUnityPlayer.quit (). Come detto qui , mUnityPlayer.quit () uccide completamente il process in cui si esegue. Quindi, in fondo, ciò che accade è che l'intera applicazione esca quando commuto frammenti (cioè, passare le tabs in NavigationDrawer), perché chiama l'onDestroy del UnityPlayerNativeFragment .

    Non voglio questo. Idealmente, l'utente passerebbe ad un'altra scheda in NavigationDrawer e quando tornerà alla scheda della scena Unity, è esattamente where lo ha lasciato. Come se avessero usato il multi-tasking Android per cambiare app e tornare – niente cambia.

    Se fosse un'attività, è ansible aprirlo in un process diverso da quello principale, aggiungendo la row android:process=":UnityKillsMe" nel file Manifest, ma questo non è ansible per un frammento. Così, le mie domande:

    1. Come posso aprire UnityPlayerNativeFragment in un nuovo process, in modo che la function .quit () non uccida l'intera applicazione e in modo che riesco a rilanciare il frammento quando l'utente lascia la scheda e poi ritorna?
    2. Anche se posso raggiungere Q1, resta la questione dello stato. Chiudere e poi ricaricare la scena Unity lo ricreiterà di nuovo, partendo dalla visualizzazione predefinita e perdendo le properties; che ha avuto (ad esempio immagina che fosse un gioco, quindi tutti i dati sarebbero stati persi). Quindi la domanda 2 è: come posso passare a un'altra scheda nella stessa applicazione, quindi tornare alla scheda Unity, senza cambiare la scena? (Essenzialmente, mantenendolo in esecuzione in background senza abbandonarlo affatto).

    Ecco come commuto frammenti (dalla MainActivity):

     @Override public void onNavigationDrawerItemSelected(int position) { // update the main content by replacing fragments FragmentManager fragmentManager = getFragmentManager(); if (position==3) { fragmentManager.beginTransaction() .replace(R.id.container, DirectoryFragment.newInstance(position + 1)) .commit(); } else if (position == 0) { upnf = UnityPlayerNativeFragment.newInstance(position + 1); fragmentManager.beginTransaction() .replace(R.id.container, upnf, "UnityPlayerNativeFragment") .commit(); } else if (position == 2){ fragmentManager.beginTransaction() .replace(R.id.container, WeatherFragment.newInstance(position + 1)) .commit(); } else if (position == 4) { fragmentManager.beginTransaction() .replace(R.id.container, SettingsFragment.newInstance(position + 1)) .commit(); //Log.d("worked pos=4","worked pos=4"); } else{ fragmentManager.beginTransaction() .replace(R.id.container, PlaceholderFragment.newInstance(position + 1)) .commit(); } } 

  • Come riflettere gli elementi in un RecyclerView con lo StaggeredGridLayoutManager
  • Leggere un Array Json in android
  • Libgdx: spostamento di una telecamera prospettica ruotata
  • Come posso aprire una pagina web in App Inventor
  • Impostare l'elemento selezionato di spinner in modo programmato
  • Android: il servizio si arresta quando l'attività è chiusa
  • One Solution collect form web for “Come posso aprire un frammento di Android in un nuovo process?”

    grazie per il tuo codice. Sto trovando il codice come cambiare l'attività dell'unità in un frammento.

    Per la tua domanda, sto pensando perché devi call mUnityPlayer.quit (); su Destory () metodo. il metodo onDestory significa finitura del frammento. non l'attività.

    Penso di rimuovere il metodo di smettere. aggiungere un ascoltatore tra il frammento con MainActivity, quando la MainActivity onDestroy chiama il metodo di frammento per call la chiusura unità.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.