当前位置: 首页 > 知识库问答 >
问题:

使用“后退”按钮关闭活动后恢复活动

顾嘉德
2023-03-14

我有一个玩家活动和浮动玩家(服务),点击后退按钮后,玩家活动关闭,浮动玩家开始行动,当我点击浮动玩家时,我想回到玩家活动,但没有再次运行创建方法。

我在StackOver Flow中读到了很多解决方案,特别是使用FLAG\u ACTIVITY\u CLEAR\u TOP和FLAG\u ACTIVITY\u SINGLE\u TOP标志,或者将android:launchMode=“singleTask”/android:launchMode=“singleInstance”添加到清单中的玩家活动中,但它们都没有真正起作用。

如果有一个真正的解决方案,使我的玩家活动的一个单一的任务,而不是重新打开它从创建方法,我会很高兴。

玩家活动:

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个答案

单于翰飞
2023-03-14

试试这个

 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"
田翰林
2023-03-14

我猜问题是当您单击返回时,活动的完成()方法被调用,活动被销毁,因此下次您启动它时,它将转到onCreate()。你可以试试这个在Main Activity.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()

 类似资料:
  • 我正在使用android 2.1,希望在Mapsavity上添加一个后退按钮。我在这一页上尝试了什么[在操作栏上显示后退按钮,但应用程序崩溃。我已经按照另一个论坛的建议将extends FragmentActivity替换为AppCompatActivity,但应用程序仍然崩溃。我知道这与操作栏有关,因为如果我删除它,应用程序就会工作。操作栏似乎为空。我被卡住了,已经启动了应用程序数次。下面是错误

  • 我通过以下代码阻止返回登录活动: 当用户处于第二个活动上并且他按下主页按钮,应用程序进入后台,当他恢复它时,第二个活动出现 - 没关系。但是,当用户在第二个活动中按后退按钮时,应用程序进入后台,当他重新喜欢它时 - 登录活动再次创建并且它处于前期。 如何防止再次创建登录活动?或者,我不应该完成登录活动,而是应该检查用户是否已登录-如果是,我应该显示第二个活动? 清单:

  • 我用这个教程来实现facebook登录等。 Facebook登录 我在这里添加了新的片段来显示朋友列表。现在,当我在新添加的片段上按下后退按钮时,它会把我带到SPLASH片段,我想要动作栏上同样的后退按钮行为。这意味着当我在我的新片段上时,它会在动作栏上显示一个后退按钮。按下后退按钮会把我带回SPLASH屏幕。

  • 我试图用这段代码来显示我的个人档案活动: 当我点击Profile菜单项时,我可以看到我的ProfileActivity,但我的ActionBar上没有任何back按钮来返回我以前的活动。 那么,我如何显示一些后退按钮?我的代码是否正确以显示菜单中的活动?

  • 当使用Intent启动一个新活动时,活动顶部的栏是否会自动提供后退按钮?我假设它是这样工作的,但没有看到它。如果它没有自动出现,需要什么来使它出现?

  • 问题内容: 我最近在许多Android应用程序和游戏中都注意到了这种模式:单击“后退”按钮以“退出”该应用程序时,会出现类似“请再次单击BACK退出”的消息。 我想知道,正如我越来越经常看到的那样,这是你可以以某种方式在活动中访问的内置功能吗?我看过许多类的源代码,但似乎找不到任何东西。 当然,我可以考虑几种很容易实现相同功能的方法(最简单的方法可能是在活动中保留一个布尔值,以指示用户是否已经单击