四大组件(一)——Activity

活动是一种可以包含用户界面的组件,用于和用户进行交互。一个应用程序可以包含一个或多个活动。活动的主要内容有:

  • 活动的连接桥梁—Intent
  • 活动的生命周期
  • 活动的启动模式
  • 调试程序时活动的应用

一、活动的连接桥梁—Intent

1.Intent的使用方式

  • 显式:

    1. 在清单文件中注册

      <activity 
          android:name="com.itheima.intent.Activity02"
          android:label="第一个界面" >
      </activity>
    2. 活动中启动

        Intent intent = new Intent(this,SecondActivity.class);
        startActivity(intent);
  • 隐式:

    1. 活动中清单文件中注册

      <activity android:name="com.itheima.intent.Activity02">
      
          <!-- 意图过滤器 -->
          <intent-filter >
              <!-- 声明了一个action动作 只有来访的intent匹配了这个动作,就会把这个界面启动起来-->
              <action android:name="com.sky.intent.action.OPEN02"/>
              <!--下面这句话是默认的,不写也可以-->
              <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
      </activity>

      活动注册时,intent-filter,共有三个参数是可用的

      action : 动作, 一般使用自定义的动作
      data : 数据: 一般指定scheme即可 ,后面的可以不用指定
      category :分类,一般使用默认即可

    2. 在主活动中启动

      Intent intent = new Intent();
      //1.指定意图的动作,这个动作必须要与02界面注册的动作一致,否则将不能启动。
      intent.setAction("com.sky.intent.action.OPEN02");
      
      //2.这句话可以不用写,但是其它的category时是要写的。
      intent.addCategory("android.intent.category.DEFAULT");
      
      startActivity(intent);

2.Intent数据传递

数据的传递可分为两种:正向传递和反向传递,

2.1 正向传递

人品计算器

2.2反向传递

反向传递最重要的就是:在intent传递到下一个界面时,用startActivityForResult(intent, requestCode )开启下一个界面,这样,第一个界面就会在onActivityResult(int requestCode, int resultCode, Intent data) 方法中等待数据返回。requestCode 和 resultCode区别是:

  • requestCode

    请求码 , 当前界面有多个请求发送出去,但是当前界面只有一个方法用来接收数据, 那么可以使用requestCode去区分当前回来的数据属于哪一个请求。在这个startActivityForResult(intent, 1)方法中设置。

  • resultCode

    这个在下一个界面设置,用于区别一个界面中不同的数据setResult(1, intent);

其中,反向传递的详细步骤如下:

  1. 启动界面等待结果返回

    Intent intent = new Intent(this , SmsListActivity.class);
    //startActivity(intent);
    //1. 启动下一个界面,然后等待结果的返回。
    startActivityForResult(intent, 1);
  2. 设置结果

    //2.,设置返回的数据
    Intent intent = new Intent();
    intent.putExtra("result", result);
    //设置返回的结果给上一个界面
    setResult(1, intent);
  3. 关闭界面

    //3. 关闭界面
    finish();
  4. 接收数据

    //由系统调用,当下一个界面返回结果的时候,该方法将会被调用。
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //4.接收下一个界面返回的结果
        String result  = data.getStringExtra("result"); 
        et_content.setText(result);
    }

二、活动的生命周期

活动的生命周期包含:

  • 运行状态:生于栈顶,可见
  • 暂停状态:不在栈顶,可见
  • 停止状态:不在栈顶,不可见
  • 销毁状态:从栈中移除

活动的生命周期可以分为:

  • 完整生命周期:onCreate()与onDestroy()之间
  • 可见生存期:onStart()与onStop()之间
  • 前台生存期:onResume()与onPause()之间

活动有一个比较重要的思想是:考虑用户体验——用户看得到的,不要让程序自动关闭。(不要让一个屏幕突然消失)。

三、活动的启动模式

1.standard

是默认的启动模式,这个模式,不管栈中是否存在这个Activity,只在开启(或重新开启)就会调用这个活动的Activity的onCreate()方法,创建不同的对象(不同的内存地址)。这种方式对内存的消耗很大。

2.singleTop

这个模式在上一个模式中更进一步,只要在栈顶的是Activity是我们即将要创建的Activity,那就用同一个对象,onCreate()方法也不会再调用了。
但对于暂停状态的Activity,试图再次创建它时,还是再创建一个不同的对象的。

3.singleTask

这个模式,让一个Task中,只能存在一个同一类的Activity。
假如有两个Activity:FirstActivity、SecondActivity,在First中通过Button开启Second。再在Second中开启First,流程会如下:
1. 如果调用时,发现内存中已经有这个FirstActivity的对象时,
2. SecondActivity会onStop()和onDestroy(),出栈。
3. 调用FirstActivity的onStart()方法,让FirstActivity在栈顶。

4.singleInstance

这个其实是多个不同的Task,搞出来的事。如果在SecondActivity中指定了singleInstance。并让FirstActivity,进到SecondActivity,再进入到ThirdActivity。
那他们1和3是在同一个栈中的,2是在不同的栈中的。
这种模式会搞一个单独的栈来开启一个Activity。

四、调试程序时活动的应用

1.了解活动的调用顺序

怎么了解一个程序活动的调用顺序呢?可以通过新建一个BaseActivity,让其它的Activity都继承这个BaseActivity,如下:

public class BaseActivity extends Activity{
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Log.i("BaseActivity",getClass().getSimpleName());
    }
}

2.一键退出所有的程序

当有多个应用程序开启时,如果想一键退出所有的程序,可以建一个类来实现:

public class ActivityColletor{
public static List<Activity> activitise =new ArrayList<Activity>();
public static void addActivity(Activity activity){
    activity.add(activity);
}
public static void removeActivity(Activity activity){
    activity.remove(activity);
}
public static void finishAll(){
    for(Activity activity:activities){
        if9(!activity.isFinishing){
            activity.finesh();
        }
    }
}

之后,再在每一个Activity的onCreate方法中,加入如下语句:
ActivityColletor。addActivity(this);
之后就可以统一操作这个List集合中的活动了(可以统一关闭)。

3.启动活动方式的优化

如果程序之间有数据需要传递,且不同活动是不同程序猿写的,那么,怎么明确活动间的数据就尤为重要了。如FirstActivity,开启SecondActivity,SecondActivity可以加一个如下函数

public static void actionStart(Context,data1,data2,....){
    Intent intent =new Intent(context,SecondActivity.class);
    intent.putExtra("param1",data1);
    intent.putExtra("param2",data2);
    .......
    context.startActivity(intent);
}

这样在FirstActivity中直接调用上面的函数就可以了

SecondActivity.actionStrat(FirstActivity.this,"data1","data2",.....);

这种方式最主要的特点就是要开启second的人很清晰second要什么数,传数据时更加便捷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值