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

来源:互联网 发布:js中string的方法 编辑:程序博客网 时间:2024/05/29 14:25

启动 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;@Overridepublic 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 0