• 活动


    活动

    基本用法

    1. 创建Activity子类

    2. 创建和加载布局

    3. 在manifest文件中注册

    4. 隐藏标题栏

    5. 销毁活动

    6. 在活动中使用Toast

    7. 在活动中使用Menu

    活动间通讯(Intent)

    Intent用于各组件(活动、服务、广播等)之间进行交互。

    1. 显式使用Intent
    1. button1.setOnClickListener(newOnClickListener(){
    2. @Override
    3. publicvoid onClick(View v){
    4. Intent intent =newIntent(FirstActivity.this,SecondActivity.class);
    5. startActivity(intent);
    6. }
    7. })
    1. 隐式使用Intent
    1. <activityandroid:name=".SecondActivity">
    2. <intent-filter>
    3. <actionandroid:name="com.example.activitytest.ACTION_START"/>
    4. <categoryandroid:name="android.intent.category.DEFAULT"/>
    5. </intent-filter>
    6. </activity>

    只有<action><category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent。

    1. button1.setOnClickListener(newOnClickListener(){
    2. @Override
    3. publicvoid onClick(View v){
    4. Intent intent =newIntent("com.example.activitytest.ACTION_START");
    5. startActivity(intent);
    6. }
    7. });

    这里没有指定category是因为使用了默认的category。
    每个Intent中只能指定一个action,但却能指定多个category。

    1. button1.setOnClickListener(newOnClickListener(){
    2. @Override
    3. publicvoid onClick(View v){
    4. Intent intent =newIntent("com.example.activitytest.ACTION_START");
    5. intent.addCategory("com.example.activitytest.MY_CATEGORY");
    6. startActivity(intent);
    7. }
    8. });

    使用隐式Intent不仅可以启动自己程序内的活动,还可以启动其他程序的活动。

    1. button1.setOnClickListener(newOnClickListener(){
    2. @Override
    3. publicvoid onClick(View v){
    4. Intent intent =newIntent(Intent.ACTION_VIEW);
    5. intent.setData(Uri.parse("http://www.baidu.com"));
    6. startActivity(intent);
    7. }
    8. });

    Intent.ACTION_VIEW是Android内置的动作,然后通过setData()将Uri对象传递进去。与此对应,我们还可以在intent-filter标签中再配置一个<data>标签,用于更精确地指定当前活动能够响应什么类型的数据。

    1. 活动间传递数据
    • 向下个活动传递数据
      首先向Intent中放入数据intent.putExtra("key", data);,然后取出数据String data = getIntent().getStringExtra("key");

    • 返回数据给上个活动
      Activity还有一个startActivityForResult()方法也是用来启动活动的。两个参数,intent和请求码。后者只需要是唯一值就可以。我们使用这个方法来创建SecondActivity。

    1. button1.setOnClickListener(newOnClickListener(){
    2. @Override
    3. publicvoid onClick(View v){
    4. Intent intent =newIntent(FirstActivity.this,SecondActivity.class);
    5. startActivityForResult(intent,1);
    6. }
    7. });

    然后,在SecondActivity中添加返回数据的逻辑,可以添加新的按钮,或者重写back操作——onBackPressed()。

    1. @Override
    2. publicvoid onBackPressed(){
    3. Intent intent =newIntent();
    4. intent.putExtra("data_return","Hello FirstActivity");
    5. setResult(RESULT_OK, intent);
    6. finish();
    7. }

    最后,重写FirstActivity的onActivityResult方法来获得返回的数据。

    1. @Override
    2. protectedvoid onActivityResult(int requestCode,int resultCode,Intent data){
    3. switch(requestCode){
    4. case1:
    5. if(resultCode == RESULT_OK){
    6. String returnedData = data.getStringExtra("data_return");
    7. Log.d("FirstActivity", returnedData);
    8. }
    9. break;
    10. default:
    11. }
    12. }

    生命周期

    1. 返回栈
      Android使用任务(Task)来管理活动,一个任务就是一组存放在返回栈中的活动。

    2. 活动状态

    状态活动所处位置活动可见性备注
    运行状态 栈顶 可见 系统不愿意回收的活动,因为会带来非常差的用户体验
    暂停状态 不在栈顶 可见 栈顶的活动可能没有占满整个屏幕,比如对话框
    停止状态 不在栈顶 不可见 系统仍然会为活动保持状态和变量,但是一旦需要内存,就可能被系统回收
    销毁状态 不在栈顶 不可见 最倾向于回收的活动
    1. 活动的生存期
    顺序方法名作用
    1 onCreate() 创建活动时调用,加载布局,绑定事件等。
    2 onStart() 活动由不可见变为可见时调用
    3 onResume() 此时活动一定处在栈顶,并且处于运行状态。
    4 onPause() 准备启动或恢复另一个活动时调用,通常会将一些耗CPU的资源释放掉,以及保持一些关键数据,但执行速度要快,否则会影响新的栈顶活动的使用。
    5 onStop() 如果新活动时对话框时,那么将不会调用onStop()。
    6 onDestory() 销毁之前调用,之后活动状态变为销毁状态
    7 onRestart 这个方法只在不占全屏的活动返回上一个活动时调用。比如对话框。

    1. 防止活动被回收而丢数据


      Intent还可以结合Bundle一起用于传递数据的,首先可以把需要传递的数据都保存在Bundle对象中,然后再将Bundle对象存放在Intent里。到了目标活动之后先从Intent中取出Bundle,再从Bundle中取出数据。

    启动模式

    1. standard
      每次启动活动都创建活动的新实例。

    2. singleTop
      启动的活动已经在栈顶时,不创建新的实例,不再栈顶则新建活动实例。

    3. singleTask
      返回栈中存在启动的活动时,会将该活动之前的活动都出栈,直到启动的活动到达栈顶。
    4. singleInstance
      为该活动新建一个返回栈,解决应用程序之间共享活动的使用场景。

    最佳实践

    一些使用技巧

    1. 获知当前的活动名称
      所有的活动都继承下面的BaseActivity,这个类通过日志输出当前的类名。
    1. publicclassBaseActivityextendsActivity{
    2. @Override
    3. protectedvoid onCreate(Bundle savedInstanceState){
    4. super.onCreate(savedInstanceState);
    5. Log.d("BaseActivity", getClass().getSimpleName());
    6. }
    7. }
    1. 随时退出应用程序
      如果活动很多,你会发现必须一个一个活动返回,按home键只是将程序挂起,并没有退出程序。解决方案很简单——使用一个集合类来管理所有活动。
    1. publicclassActivityCollector{
    2. publicstaticList<Activity> activities =newArrayList<Activity>();
    3. publicstaticvoid addActivity(Activity activity){
    4. activities.add(activity);
    5. }
    6. publicstaticvoid removeActivity(Activity activity){
    7. activities.remove(activity);
    8. }
    9. publicstaticvoid finishAll(){
    10. for(Activity activity : activities){
    11. if(!activity.isFinishing()){
    12. activity.finish();
    13. }
    14. }
    15. }
    16. }
    1. 启动活动的最佳写法
      活动之间的耦合性很高,如果是协作开发的话,会遇到对接问题。换一种写法可以解决:
      添加一个actionStart()方法,在方法中完成Intent的创建,另外将所有活动需要的数据都通过参数传递过来。如此一来活动所需的数据可以从参数列表中体现出来,而无需阅读要启动的活动的源码或者询问相关同事了。





  • 相关阅读:
    PAT-1020 Tree Traversals
    PAT- 1014 Waiting in Line
    Python稀疏矩阵运算
    阿里云Hadoop集群DataNode连接不上NameNode
    运行python “没有那个文件或目录3” 或 “/usr/local/bin/python3^M: bad interpreter: 没有那个文件或目录” 错误
    #!/usr/bin/python3 和 #!/usr/bin/env python3的区别
    VBoxManage安装
    Redhat终端中文乱码解决
    Redhat更换yum源
    Redhat乱码
  • 原文地址:https://www.cnblogs.com/qianzi067/p/6015540.html
Copyright © 2020-2023  润新知