Android 启动 Activity和一键退出应用的的最佳方法

启动 Activity

常规的启动Activity的方法,就是通过Intent构建一个意图,然后通过context.startActivity() 或者context.startActivityForResult()将活动启动起来

        Intent intent = new Intent(this,MainActivity.class);
        intent.putExtra("params1","a");
        intent.putExtra("params2","b");
        startActivity(intent);

这样写是正确的,但是就是有一个问题,就是团队开发的对接问题,如果要启动的Activity并不是自己开发的话,那么就不清楚要传递什么数据过去.’

最佳的写法应该是下面这种

  public static void startActivity(Context context,String data1,String data2){
        Intent intent = new Intent(context,MainActivity.class);
        intent.putExtra("params1", data1);
        intent.putExtra("params2",data2);
        context.startActivity(intent);
    }

这样就很好的解决了数据传递问题,而不需要询问另一个页面的开发人员或者看第二个页面的代码了.

一键退出应用1

当我们的应用层次很深的时候,我们想要退出应用的时候,这时候点击back键会一层一层的 将回退栈清空然后退出应用(正常的launchMode),点击Home,也只是将应用切换至后台,而不是退出,

在开发的过程中,我们一般是用一个单例类(Stack)来管理

/**
 * Created by BoBoMEe on 2015/12/30.
 */
public class ActivityStack {

    private static ActivityStack instance;
    private Stack<Activity> activityStack;//activity栈

    private ActivityStack() {
    }

    //单例模式
    public static ActivityStack getInstance() {
        if (instance == null) {
            instance = new ActivityStack();
        }
        return instance;
    }

    //把一个activity压入栈中
    public void push(Activity actvity) {
        if (activityStack == null) {
            activityStack = new Stack<Activity>();
        }
        activityStack.add(actvity);
    }

    //获取栈顶的activity,先进后出原则
    public Activity getLast() {
        return activityStack.lastElement();
    }

    //移除一个activity
    public void pop(Activity activity) {

        if (activity != null && !activity.isFinishing()&&activityStack != null && activityStack.size() > 0&&activityStack.contains(activity)){
            activity.finish();
            activityStack.remove(activity);
        }
    }

    //退出所有activity
    public void finishAll() {
        if (activityStack != null) {
            while (activityStack.size() > 0) {
                Activity activity = getLast();
                if (activity == null) break;
                pop(activity);
            }
        }
    }

}

同时.我们需要写一个所有Activity的基类BaseActivity.其他Activity都来继承这个类即可。

/**
 * Created by BoBoMEe on 2015/12/30.
 */
public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityStack.getInstance().push(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
         ActivityStack.getInstance().pop(this);
    }
}

在我们的应用中,正常返回则是将List中的Activity移除,同时,一键退出的时候,我们可以选择finishAll()方法

  public void finishAll(View view){
        ActivityStack.getInstance().finishAll();
    }

一键退出应用2

利用的是ActivitylaunchMode和广播来实现,我们都知道Activity中有个launchMode = singleTask,如果设置后,跳转到相应Activity会将其上的栈清空,调用相应ActivityonNewIntent方法,那么这种实现步骤如下:

  1. 设置MainActivity的加载模式为singleTask
  2. 重写MainActivity中的onNewIntent方法
  3. 需要退出时在Intent中添加退出的tag

Manifest

<activity android:name="MainActivity" android:launchMode="singleTask"/>

MainActivity的onNewIntent

private static final String TAG_EXIT = "exit";

  @Override
  protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (intent != null) {
      boolean isExit = intent.getBooleanExtra(TAG_EXIT, false);
      if (isExit) {
        this.finish();
      }
    }
  }

退出广播

Intent intent = new Intent(this,MainActivity.class);
    intent.putExtra(MainActivity.TAG_EXIT, true);
    startActivity(intent);

双击退出应用

  • 再按一次退出
private long exitTime = 0;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK
            && event.getAction() == KeyEvent.ACTION_DOWN) {
        if ((System.currentTimeMillis() - exitTime) > 2000) {
            Toast.makeText(getApplicationContext(), "再按一次退出程序",
                    Toast.LENGTH_SHORT).show();
            exitTime = System.currentTimeMillis();
        } else {
            finish();
            System.exit(0);
        }
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
  • 对话框退出应用
 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // back按键
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0
                && isStackBottomActivy(this)) {
            confirmQuit(this);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

判断当前Activity是否在栈顶

有时我们会判断当前是否处在栈顶,是栈顶的话就退出应用,否则向上回退,或者在栈顶做一些自定义操作等。

 // 判断当前Activity是否是在栈顶
  public static boolean isStackBottomActivy(Activity activity) {
        ActivityManager manager = (ActivityManager) UIUtils.getContext().getSystemService(Context.ACTIVITY_SERVICE);
        String name = manager.getRunningTasks(1).get(0).topActivity.getClassName();
        return name.equals(activity.getClass().getName());
    }
 // 连续点击返回,退出应用
    public static void confirmQuit(final Context context) {
        AlertDialog.Builder build = new AlertDialog.Builder(this);
            build.setTitle("系统提示").setMessage("确定要退出吗?");
            build.setPositiveButton("确定",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    });
            build.setNegativeButton("取消",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    }).show();
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值