AndroidAndroid开发程序员

02探究活动-活动的最佳实践

2018-03-16  本文已影响7人  何惧l

知晓当前的是在哪一个活动

  1. 首先新建一个BaseActivity类,创建的是普通的类,继承AppCompatActivity,并且重写这个onCreate()方法
public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 获取当前实例的类名
        Log.d("BaseActivity",getClass().getSimpleName());
    }
}
  1. 这个时候让所有的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);
            }
        });

    }
}


  1. 这个时候,点击按钮分别进入MainActivity,SecondActivity,ThirdActivity中


    2018-03-16_09-11-24.png

    每当进入到一个活动,该活动的类名就会被打印

随时随地的退出程序

此时还停留在ThirdActivity页面中,这个时候得按三次Back键才可以退出程序,按Home键只是把程序挂起,并没有退出程序,这个时候得需要一个注销的功能,随时随地能直接的退出程序

  1. 需要创建一个专门的集合对所有的活动那个进行管理,新建一个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();
            }
        }
    }

}

  1. 这个时候修改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);
    }
}
  1. 这个时候不管你在什么地方就可以随时的退出程序了,只需调用这个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来实现

  1. 例在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);
            }
        });

  1. 这样是没有任何问题的,但是这样写有时会产生麻烦,这个就得换一种写法了,在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

  1. 这样写的好处是一目了然,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中就可以得到传递的数据了

上一篇 下一篇

猜你喜欢

热点阅读