【问题标题】:Resume activity after close it with back button使用后退按钮关闭活动后恢复活动
【发布时间】:2019-10-02 10:07:31
【问题描述】:

我有一个播放器活动和浮动播放器(服务),单击后退按钮后播放器活动关闭并且浮动播放器开始运行,当我单击浮动播放器时我想返回播放器活动但是没有再次运行 onCreate 方法。

我在 StackOver Flow 中阅读了很多解决方案,尤其是使用 FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP 标志,或将 android:launchMode="singleTask" / android:launchMode="singleInstance" 添加到 Manifest 中的 Player Activity,但它们都没有真正起作用。

如果有一个真正的解决方案可以对我的 Player Activity 执行单个任务,而不是从 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 中添加了 Intent.FLAG_ACTIVITY_NEW_TASK,因为它是来自服务的 Intent,否则它会崩溃。

【问题讨论】:

  • 当一个活动被销毁时,你不能把它带回来,也不能通过onCreate。为什么会出现问题?你想避免什么?

标签: java android android-activity


【解决方案1】:

我想问题是当你点击“返回”时,Activity 的finish() 方法被调用,Activity 被销毁,所以下次你启动它时它会转到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);
}

这样当你回到你的应用程序时,Activity 不会被销毁,也不会转到onCreate()

【讨论】:

  • 非常漂亮的 Yoav!在我的真实应用中,我需要回到 MainActivity.Class,而不是 Home,我该如何调整它?
  • @Hila 玩家活动不是叫MainActivity吗?无论如何,在您的玩家活动中,您可以像在 Danial 的回答中一样启动 MainActivity 而不是 goToHome() 方法。
  • 在我的问题中,我添加了一个示例代码。在我的真实应用程序中有 A.class、B.class 和 C.class,我怎样才能从 C.class 回到 B.class以你的方式回答
【解决方案2】:

试试这个

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

并且在 add for B 活动的清单中

android:launchMode="singleInstance"

【讨论】:

  • 我试过了,不行,还在运行onCreate方法。重点正是 Yoav 所说的,onBack 方法是破坏活动...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多