¿Cómo puedo abrir un Fragmento de Android en un nuevo proceso?

La aplicación en la que estoy trabajando utiliza un Cajón de navegación y cada pestaña abre un nuevo fragmento en la actividad (reemplazando el antiguo).

Uno de estos Fragmentos es una escena de Unity3D. Básicamente, lo que hice fue:

  1. Exportar el proyecto Unity como una aplicación para Android
  2. Abrir la Actividad que dio (que fue UnityPlayerNativeActivity)
  3. Convierta este UnityPlayerNativeActivity en un fragmento, como se muestra en el siguiente código. También cambié algunas cosas menores en el Manifiesto.

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

El problema aquí es con la función mUnityPlayer.quit (). Como se menciona aquí , mUnityPlayer.quit () mata por completo el proceso en el que se está ejecutando. Así que básicamente lo que sucede es que toda la aplicación sale cuando conmuto fragmentos (es decir, cambiar las pestañas en el NavigationDrawer), porque llama a onDestroy del UnityPlayerNativeFragment .

No quiero esto. Idealmente, el usuario cambiaría a otra pestaña en el NavigationDrawer, y cuando vuelva a la pestaña de la escena de Unity, es exactamente donde la dejó. Como si utilizasen la multitarea de Android para cambiar las aplicaciones y volver, nada cambia.

Si se tratara de una Actividad, sería posible abrirla en un proceso diferente al de la aplicación principal añadiendo la línea android:process=":UnityKillsMe" en el archivo Manifest, pero esto no es posible para un fragmento. Por lo tanto, mis preguntas:

  1. ¿Cómo puedo abrir el UnityPlayerNativeFragment en un nuevo proceso, para que la función .quit () no destruya toda mi aplicación, y para que pueda relanzar el fragmento cuando el usuario abandona la pestaña y luego vuelve a ella?
  2. Incluso si puedo lograr el primer trimestre, queda la cuestión del Estado. Salir y volver a cargar la escena de Unity lo volverá a crear, empezando desde la vista predeterminada y perdiendo las propiedades que tenía (por ejemplo, imagine que era un juego, entonces todos los datos se perderían). Así que la pregunta 2 es: ¿cómo puedo cambiar a otra pestaña en la misma aplicación, a continuación, volver a la ficha Unidad, sin tener el cambio de escena en absoluto? (Esencialmente, manteniéndolo funcionando en el fondo sin dejarlo en absoluto).

Aquí es cómo estoy cambiando fragmentos (de la 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(); } } 

Gracias por su código. Estoy encontrando el código para cambiar la actividad de la unidad a un fragmento.

Para su pregunta, estoy pensando en por qué necesita llamar a mUnityPlayer.quit (); En el método Destory (). El método onDestory significa el acabado del fragmento. No la actividad.

Creo que eliminar el método de dejar de fumar. Agregar un oyente entre el fragmento con MainActivity, cuando el MainActivity onDestroy, llamar al método de fragmento para llamar a la unidad quit.

  • Entrada de un juego de ritmo
  • Juego para móviles con Unity - Plugin para compra en la aplicación
  • Establecer gravedad para LinearLayout mediante programación
  • ¿Cómo subir un juego de unidad que es más de 50 mb a google playstore?
  • Unity 2D: ¿Cómo soportar plataformas múltiples y diferentes dispositivos de relación de aspecto en Unity 2D?
  • ¿Cómo implementar multitouch en Unity3d en un dispositivo móvil?
  • UnityWebRequest Incorporación de datos de usuario y contraseña para la autenticación HTTP básica que no funciona en Android
  • Error de segmentación OSX 11 - Android
  • Callback Listener en Unity - Cómo llamar al método de archivo de script desde UnityPlayerActivity en Android
  • Cómo acceder al enum en Unity AndroidJavaClass
  • Compruebe la conexión a Internet desde Unity
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.