知晓当前的是在哪一个活动
- 首先新建一个BaseActivity类,创建的是普通的类,继承AppCompatActivity,并且重写这个onCreate()方法
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 获取当前实例的类名
Log.d("BaseActivity",getClass().getSimpleName());
}
}
- 这个时候让所有的ActivityTest项目中的活动都继承自BaseActivity,因为这个类又是继承AppCompatActivity,所以项目中的活动并不受影响
// 继承子自己定义的
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
Button but_1 = (Button)findViewById(R.id.but_1);
but_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
}
-
这个时候,点击按钮分别进入MainActivity,SecondActivity,ThirdActivity中
每当进入到一个活动,该活动的类名就会被打印
随时随地的退出程序
此时还停留在ThirdActivity页面中,这个时候得按三次Back键才可以退出程序,按Home键只是把程序挂起,并没有退出程序,这个时候得需要一个注销的功能,随时随地能直接的退出程序
- 需要创建一个专门的集合对所有的活动那个进行管理,新建一个ActivityCollector类作为活动的管理器
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<>();
// 用于添加到这个集合
public static void addActivity(Activity activity){
activities.add(activity);
}
// 把这个活动从集合中移除
public static void removeActivity(Activity activity){
activities.remove(activity);
}
// 把存在的活动都销毁
public static void finishAll(){
for (Activity activity:activities){
if (!activity.isFinishing()){
activity.finish();
}
}
}
}
- 这个时候修改BaseActivity中的代码
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 获取当前实例的类名
Log.d("BaseActivity",getClass().getSimpleName());
// 获取当前活动添加到集合中
ActivityCollector.addActivity(this);
}
// 重写这个销毁方法,当活动销毁的时候从集合中移除
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
- 这个时候不管你在什么地方就可以随时的退出程序了,只需调用这个finishAll()这个方法即可,在最后的这个页面调用
public class ThirdActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
Button but_1 = (Button)findViewById(R.id.but_1);
but_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCollector.finishAll();
}
});
}
}
此时当点击到这个ThirdActivity页面中的按钮的时候,就直接退出程序了
启动活动的最佳写法
启动活动使用Intent构建当前想去的布局,然后调用startActivity()或者startActivityForResult()方法将活动启动起来,如果要有数据从一个活动传递到另一个活动,也可以使用Intent来实现
- 例在SecondActivity中要用到两个字符串参数,在启动SecondActivity的时候就必须要传递过来,那么就是
but_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("param1","data1");
intent.putExtra("param2","data2");
startActivity(intent);
}
});
- 这样是没有任何问题的,但是这样写有时会产生麻烦,这个就得换一种写法了,在SecondActivity中修改代码
public class SecondActivity extends BaseActivity {
public static void actionStart(Context context,String data1,String data2){
Intent intent = new Intent(context,SecondActivity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
context.startActivity(intent);
}
}
在SencdongActivity中添加了一个actionStart()的方法,这个方法完成了Intent的构建,所有SecondActivity中需要的数据都是通过actionStart()方法的参数传递过来的,饭后把它存储到Inten中,最后调用startActivity()方法启动SecondActivity
- 这样写的好处是一目了然,SecondActivity所需要的参数既可以全部体现出来了,只要一行代码就可以启动SecondActivity了,在MainActivity中
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
Button but_1 = (Button)findViewById(R.id.but_1);
but_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 只需要一行就可以启动SecondActivity了
SecondActivity.actionStart(MainActivity.this,"data1","data2");
}
});
}
}
这样在SecondActivity中就可以得到传递的数据了