Возобновить деятельность после закрытия кнопкой возврата - PullRequest
0 голосов
/ 02 октября 2019

У меня есть активность игрока и плавающий игрок (услуга), после нажатия кнопки «Назад» активность игрока закрывается, и плавающий игрок переходит в действие, когда я нажимаю на плавающего игрока, я хочу вернуться к активности игрока, нобез повторного запуска метод onCreate .

Я прочитал много решений в StackOver Flow, особенно использую флаги FLAG_ACTIVITY_CLEAR_TOP и FLAG_ACTIVITY_SINGLE_TOP ,или добавьте android: launchMode = "singleTask" / android: launchMode = "singleInstance" к активности игрока в манифесте, но ни один из них на самом деле не работает.

Я был бы рад, если бы существовало реальное решение, которое сделало бы одну задачу для моей активности игрока, а не открывало бы ее заново методом onCreate.

Активность игрока:

public class MainActivity extends AppCompatActivity {

    private WebView webView;

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("https://www.youtube.com/embed/bWsIJ7UVxQs");
        Toast.makeText(this, "onCreate is running!", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        startService(new Intent(MainActivity.this, WindowPlayer.class));
    }
}

Плавающий игрок (служба):

public class WindowPlayer extends Service {

    private WindowManager windowManager;
    private View contFloatingPlayer;
    private WindowManager.LayoutParams contPlayerParams;
    private WebView webView;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @SuppressLint("ClickableViewAccessibility")
    @Override
    public void onCreate() {
        super.onCreate();
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        initFloatingPlayer();

        webView.loadUrl("https://www.youtube.com/embed/bWsIJ7UVxQs");

        webView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                contFloatingPlayer.setVisibility(View.GONE);
                webView.destroy();
                return false;
            }
        });

        webView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_UP:
                        Intent backToStablePlayer = new Intent(getApplicationContext(), MainActivity.class);
                        backToStablePlayer.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                                Intent.FLAG_ACTIVITY_CLEAR_TOP |
                                Intent.FLAG_ACTIVITY_SINGLE_TOP);
                        startActivity(backToStablePlayer);
                }
                return false;
            }
        });
    }

    @SuppressLint({"ClickableViewAccessibility", "SetJavaScriptEnabled", "AddJavascriptInterface"})
    private void initFloatingPlayer() {
        int LAYOUT_FLAG;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        } else {
            LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
        }

        contPlayerParams = new WindowManager.LayoutParams(
                532,
                300,
                LAYOUT_FLAG,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);

        contPlayerParams.gravity = Gravity.TOP | Gravity.LEFT | Gravity.START;
        contPlayerParams.x = 0;
        contPlayerParams.y = 100;

        contFloatingPlayer = LayoutInflater.from(this).inflate(R.layout.activity_main, null, false);

        windowManager.addView(contFloatingPlayer, contPlayerParams);

        webView = contFloatingPlayer.findViewById(R.id.webView);

        webView.getSettings().setJavaScriptEnabled(true);

    }

Примечание. Я добавил Intent.FLAG_ACTIVITY_NEW_TASK к намерению, поскольку оно предназначено для службы, иначе это сбой.

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Попробуйте это

 Intent intent = new Intent(A.this, B.class);
                    // to restore activity if there already running
                    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);  
                    startActivity(intent);

И в декларации добавить для деятельности B

android:launchMode="singleInstance"
0 голосов
/ 02 октября 2019

Полагаю, проблема в том, что когда вы нажимаете «назад», вызывается метод действия finish(), действие уничтожается и поэтому при следующем запуске оно переходит на onCreate(). Вы можете попробовать это в MainActivity.class:

@Override
public void onBackPressed() {
    //super.onBackPressed();  // don't call the super
    goToHomeScreen();
    startService(new Intent(MainActivity.this, WindowPlayer.class));
}


public void goToHomeScreen() {
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);
}

Таким образом, когда вы вернетесь к своему приложению, действие не будет уничтожено и оно не перейдет на onCreate().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...