当应用程序转到后台时启动启动器活动

时间:2017-09-07 05:35:27

标签: android

我有4个活动,当我按下主页按钮,它进入后台,当我从后台打开它时,它从我恢复的活动开始,但我想打开Launcher活动总是因为我的第一个活动密码已设置,我希望用户每次打开应用程序时键入密码

        android:clearTaskOnLaunch="true"
        android:finishOnTaskLaunch="true"
        android:launchMode="singleInstance" 

` 我在Manifest中尝试过这个代码,但它也没有用。

我也尝试了这个,但遗憾的是结果相同

 @Override
protected void onStop() {
    sliderShow.stopAutoCycle();
    super.onStop();
   GalleryBrowserActivity.this.finish();
    Log.d("value","value on Stop"+("position"));
}

5 个答案:

答案 0 :(得分:0)

您应该更改您的应用设计!用户不希望每次退出时重新启动应用。他们可能会失去一些工作 每当用户在应用程序转到后台后返回时,您应该使用显示在当前活动上方的登录对话框或片段。

答案 1 :(得分:0)

你应该关注android的生命周期

  • 当用户按下后退按钮>> onStop()onDestroy()已调用
  • 使用时按主页按钮>> onStop()调用
  • 当用户再次返回打开应用程序而无需更多等待并从堆栈中清除(清除背景数据)>>名为onRestart()的名为
  • 如果用户关闭应用并且从后台删除应用,则会调用>> onCreate()

现在,您只需按照 Android 的生命周期找到自己的观点: - )

解决方案一:onStop()

中应用代码
Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
finish();

解决方案二:AndroidManifest.xml文件中将android:launchMode="singleTask"放入所有活动

如上所述

 <activity
       android:name=".Activity.BookingConfirmClass"
       android:label="@string/string_confrim_booking"
       android:launchMode="singleTask"
       android:parentActivityName=".Activity.HotelDetailsClass"
       android:screenOrientation="portrait" />

答案 2 :(得分:0)

如果你打电话给方法:

finish();

在你的生命周期方法中它会起作用,但它也会有缺点:

优点是,当用户点击&#34;返回&#34;该活动将被销毁,用户将不得不再次输入密码。

缺点是当用户转到另一个应用程序时可能是由于点击通知。完成使用其他应用程序后,当用户点击&#34;返回&#34;他不会找到你的活动!他必须转到启动器并再次单击您的应用程序图标。这对用户来说并不好,因为他们每次离开应用时都必须从启动器点击您的应用。

最佳方式

在Activity中声明一个布尔值,例如:

    private boolean hasUserReturned=false;

然后在您的onPause()方法中:

    @Override
    protected void onPause() {
       super.onPause();
       hasUserReturned=true;
    }

然后在你的onResume() nethod:

    @Override
    protected void onResume() {
       super.onResume();
       if(hasUserReturned){
            recreate();
       }
    }

每次用户重新访问您的应用时,这都会重新创建您的活动。它处理&#34;后退按钮&#34;没有从backstack移除您的活动的点击次数!

答案 3 :(得分:0)

我可以建议你一种方法, 使所有活动从一个BaseActivity延伸

在BaseActivity中添加变量

public static boolean HAS_RESUMED_FROM_ACTIVITY=false;

然后覆盖BaseActivity中的startActivity,如

@Override
startActivity(Intent intent){
HAS_RESUMED_FROM_ACTIVITY=true;
super.startActivity(intent);
}

现在你的活动的回复

@Override
protected void onResume(){
if(!BaseActivity.HAS_RESUMED_FROM_ACTIVITY){
//show your lock screen
}
super.onResume();
}

答案 4 :(得分:0)

<强>更新

嗨,我试图解决这个问题,以便它对未来也有用。可能是我的尝试不适合每个应用程序的要求,但在许多情况下它可能会有所帮助。这是我尝试使用片段的演示,我认为这是实现此要求的唯一可能方法。如果我在任何地方都错了,请纠正我。这是代码:

<强> MainActivity.java

public class MainActivity extends AppCompatActivity {
    private Fragment mCurrentFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        addFragment(MainFragment.newInstance());
    }

    public void replaceFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        String backStackTag = fragment.getClass().getName();
        boolean fragmentPoped = fragmentManager.popBackStackImmediate(backStackTag, 0);
        if (!fragmentPoped) {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.frame, fragment, backStackTag);
            if (backStackTag != null) {
                fragmentTransaction.addToBackStack(backStackTag);
            }
            fragmentTransaction.commitAllowingStateLoss();
        }
    }

    public void addFragment(Fragment fragment) {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        if (mCurrentFragment != null) {
            Fragment f = getSupportFragmentManager().findFragmentByTag(mCurrentFragment.getClass().getName());
            if (f != null) {
                fragmentTransaction.remove(f);
            }
        }
        fragmentTransaction.add(R.id.frame, fragment, fragment.getClass().getName());
        fragmentTransaction.commit();
        mCurrentFragment = fragment;
    }

    public void replaceInMainFragment(Fragment fragment) {
        if (mCurrentFragment != null && mCurrentFragment instanceof MainFragment) {
            ((MainFragment) mCurrentFragment).replaceFragment(fragment);
        }
    }
}

<强> activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></FrameLayout>

</RelativeLayout>

<强> MainFragment.java

public class MainFragment extends Fragment {

    private View mView;
    private Fragment mCurrentFragment;

    public static MainFragment newInstance() {
        MainFragment loginFragment = new MainFragment();
        return loginFragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mView = inflater.inflate(R.layout.fragment_main, container, false);
        Log.e("MainFragment", "onCreateView");
        return mView;
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.e("MainFragment", "onStart");
        addFragment(LoginFragment.newInstance());
    }

    public void replaceFragment(Fragment fragment) {
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        String backStackTag = fragment.getClass().getName();
        boolean fragmentPoped = fragmentManager.popBackStackImmediate(backStackTag, 0);
        if (!fragmentPoped) {
            FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.frame_main, fragment, backStackTag);
            if (backStackTag != null) {
                fragmentTransaction.addToBackStack(backStackTag);
            }
            fragmentTransaction.commitAllowingStateLoss();
        }
    }

    public void addFragment(Fragment fragment) {
        removeAllFragmentFromBackstack();
        FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
        if (mCurrentFragment != null) {
            Fragment f = getActivity().getSupportFragmentManager().findFragmentByTag(mCurrentFragment.getClass().getName());
            if (f != null) {
                fragmentTransaction.remove(f);
            }
        }
        fragmentTransaction.add(R.id.frame_main, fragment, fragment.getClass().getName());
        fragmentTransaction.commit();
        mCurrentFragment = fragment;
    }

    private void removeAllFragmentFromBackstack() {
        FragmentManager fm = getActivity().getSupportFragmentManager();
        for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
            fm.popBackStack();
        }
    }
}

<强> fragment_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/frame_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></FrameLayout>

</RelativeLayout>

<强> LoginFragment.java

public class LoginFragment extends Fragment {

    private View mView;

    public static LoginFragment newInstance() {
        LoginFragment loginFragment = new LoginFragment();
        return loginFragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mView = inflater.inflate(R.layout.fragment_login, container, false);
        Log.e("LoginFragment", "onCreateView");
        mView.findViewById(R.id.btnLogin).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((MainActivity) getActivity()).replaceInMainFragment(Fragment1.newInstance());
            }
        });
        return mView;
    }
}

<强> fragment_login.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btnLogin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Login" />

</RelativeLayout>

<强> Fragment1.java

public class Fragment1 extends Fragment {

    private View mView;

    public static Fragment1 newInstance() {
        Fragment1 fragment1 = new Fragment1();
        return fragment1;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mView = inflater.inflate(R.layout.fragment_1, container, false);
        mView.findViewById(R.id.btnFrag1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((MainActivity) getActivity()).replaceInMainFragment(Fragment2.newInstance());
            }
        });
        return mView;
    }

}

<强> fragment_1.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btnFrag1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="This is Fragment 1" />

</RelativeLayout>

<强> Fragment2.java

public class Fragment2 extends Fragment {

    private View mView;

    public static Fragment2 newInstance() {
        Fragment2 fragment1 = new Fragment2();
        return fragment1;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mView = inflater.inflate(R.layout.fragment_2, container, false);
        mView.findViewById(R.id.btnFrag2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });
        return mView;
    }

}

<强> fragment_2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btnFrag2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="This is fragment 2" />

</RelativeLayout>

希望它有所帮助。

<强> OLD

然后我认为你需要一些黑客攻击。它不会直接访问。当用户按下后退按钮或任何其他选项转到第3个活动的第2个活动时,尝试调用第2个活动。希望它符合您的应用程序的要求。

<强> ThirdActivity.java

public class ThirdActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        startActivity(new Intent(getBaseContext(), SecondActivity.class));
    }
}

<强> SecondActivity.java

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        findViewById(R.id.btnJumpToThirdScreen).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(getBaseContext(), ThirdActivity.class));
            }
        });
    }
}

<强> OLD

这是我刚才制作的演示。为此,您需要在清单中定义android:noHistory =“true”。以下是示例代码:

<强> MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btnJump).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(getBaseContext(), SecondActivity.class));
            }
        });

    }
}

<强> SecondActivity.java

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }
}

<强>的Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ccc.stackoverflow">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"

        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SecondActivity"
            android:noHistory="true"></activity>
    </application>

</manifest>

<强> activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btnJump"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="My Launcher Activity Main" />

</RelativeLayout>

试试这个演示。还要检查从Manifest中删除noHistory标志。你可以看到差异。希望它可以帮到你。