У меня есть активность игрока и плавающий игрок (услуга), после нажатия кнопки «Назад» активность игрока закрывается, и плавающий игрок переходит в действие, когда я нажимаю на плавающего игрока, я хочу вернуться к активности игрока, нобез повторного запуска метод 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 к намерению, поскольку оно предназначено для службы, иначе это сбой.