四大组件之一 ---Activity

Activity四大组件之一

什么是Activity?

Activity是Android中四大组件之一,**提供了窗口供用户与手机进行交互**,比如拨打电话/发短信/照相/浏览网页,只要是手机屏幕上能看到的东西都依托于Activity。(一个界面)
  • 创建Activity步骤:

    • 自定义一个Activity继承Activity
    • 每一个Activity要显示界面都需要在onCreate()方法里重写setContentView()方法,super()方法不能删除,给Activity创建布局时,布局名称按规范起:activity_xxx
    • 每一个Activity都需要在清单文件注册(必须注册,否则系统会找不到该Activity,会报异常)。注册在application节点下

      <activity
                  android:name=".MainActivity"
                  android:label="@string/app_name" >
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN" />
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
      
  • 如果Activity配置了
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

这两个属性,那么应用运行之后会在桌面创建当前Activity的入口图标。通常情况下一个应用程序只有一个入口,==只有入口Activity配置该属性即可==。

  • 销毁Activity

    • 通过代码销毁Activity: finish();
    • 点击back键,也就是返回键就是销毁一个Activity。当点击返回键时,会回掉:
    @Override
    public void onBackPressed() {
        super.onBackPressed();
    }

注意:物理键的返回键销毁Activity用的是finish()方法。


Activity跳转
- 显示跳转(同一个APP的不同Activity之间的跳转)
- 通过显示意图实现的跳转,就是直接通过目标Activity的字节码实现的跳转。
- 步骤:
- 通过意图进行跳转
- ==setClass==(当前Activity对象,目标Activity字节码);
“`
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);//设置跳转字节码文件显示意图
startActivity(intent);//开启跳转

        ```
- 携带数据:
    - 第一个Activity:

    ```
    Intent intent = new Intent();
            intent.putExtra("name", "你宇哥");
            intent.putExtra("age", 18);
            intent.putExtra("money",99999999);
            intent.setClass(this, SecondActivity.class);
            startActivity(intent);
    ```

    - 第二个Activity:

    ```
    Intent intent = getIntent();//获取intent
        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age", 100);
        long money = intent.getLongExtra("money", 1);
        System.out.println(name + " "+age+""+money);
    ```
    ==**记住一个原则,怎么传,怎么取。Intent传递数据内部还是使用Map来实现的。**==

  • 隐式跳转(用于不同App之间跳转)
【隐式跳转】
//通过隐式意图实现跳转
//用于不同app间跳转,只有在清单文件配置<intent-filter>的Activit才支持隐式跳转

    1、在目标Activit的清单文件配置<intent-filter>意图过滤器
        <intent-filter>
            <action android:name="android.intent.action.动作" />      //动作,系统提供了一大堆
            <category android:name="android.intent.category.分类" />  //分类,系统提供了一大堆,默认是DEFAULT
            <data android:资源分类="Uri资源名" />                          //Uri资源
        </intent-filter>

        【注意】
            1.在清单文件中定义<activity>时需要定义<intent-filter>才能被隐式意图启动
            2.<intent-filter>中至少配置一个<action>和一个<category>,否则无法被启动
            3.<intent-filter>中的<action><category><data>都可以配置多个,Intent对象中不用全部匹配,每样匹配一个即可启动
            4.如果一个意图可以匹配多个Activity,Android系统会提示选择

    2、新建Intent意图,在Intent意图中设置匹配参数

        intent.setAction("android.intent.action.动作");
        //设置Action动作

        intent.addCategory("android.intent.category.分类");
        //设置category分类
        //如果是DEFAULT,可以不写

        intent.setData(Uri.parse("资源名:资源目标")); 
        //设置资源
        //例:在清单文件中资源是"sms",我们的资源目标是给110发短信,写法:intent.setData(Uri.parse("sms:110"));

    3、开启Activit
    //startActivity(intent)


    【ps】隐式意图去匹配意图的规则
    //匹配依赖的是<intent-filter>意图过滤器
        1.如果有多个intent-filter,只需要匹配到其中一个即可
        2.如果intent-filter中的category是默认的,那么intent可以不去匹配
        3.如果一个intent-filter中有多个category标签,我们只需要匹配任意一个即可
        4.如果intent-filter中有data标签,那么intent中就必须设置setData
        5.如果一个intent-filter中有多个data标签,我们只需要匹配任意一个即可

自定义意图过滤器

<activity android:name="com.example.activity.MyActivity" >
            - 
            <intent-filter>
                <action android:name="com.itheima.myaction" />
                <category android:name="android.intent.category.DEFAULT" />
                <data
                    android:mimeType="image/jpeg"
                    android:scheme="itheima" />
            </intent-filter>
        </activity>
action 可以自己自定义
注意,如果同时在data里配置了mimeType和scheme。在打开时,必须使用:
public void startMyActivity(View view){
        Intent intent = new Intent();
        intent.setAction("com.itheima.myaction");
        intent.setDataAndType(Uri.parse("itheima:图片的地址"), "image/jpeg");
        startActivity(intent);
    }

Activity的生命周期:
- 1. resume:活动状态,
- 位于屏幕前台,并且获取到了焦点,就是可以操作
- 2. Pauseed:暂停状态,
- 已经被其他Activity覆盖了,不在位于屏幕前台了,被其他Activity覆盖或者处于半透明状态,用户不能被点击,不能交互
- 3. Stopped:停止状态,
- 完全不可见,Activity位于后台,完全不能交互


Activity的生命周期方法:(回调方法)
1. onCreate():创建,初始化页面,初始化数据
2. onStart():可见状态,页面可见
3. onResume():可操作的状态,获取焦点
4. onPause():失去焦点,不可点击,不可操作
5. onStop():完全不能交互,不可见
6. onDestroy():死亡,释放资源
7. onRestart():重新启动


把属性改成对话框类型
在清单文件的设置属性(theme)

theme = "@Android/style/Theme.Dialog"

设置透明状态

theme = "@Android/style/Theme.Translucent"

横竖屏切换
- 默认情况下,先将自己杀死,然后在重新创建—>onPause()->onStop()->onDestory()->onCreat()->onStart()->onResume()
- 设置让Activity横竖屏切换时不影响生命周期,也就是不再重新创建:
- image

固定方向:
- 清单文件Activity节点中配置:

android:screenOrientation="landscape"
  • 代码onCreate()方法创建布局之前设置:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


==Activity启动模式==

  • 四种启动模式
  • android:launchMode=”四种启动模式”
    • standard():默认模式
      • Task stack heep :任务栈
      • 先进后出,后进先出,按顺序加入到任务栈中。如果不配置启动模式默认使用的就是这种。
      • 特点:
        • 每启动一个Activity,就会创建一个新的activity
    • ==singleTop:单一顶部模式==
      • 如果Activity已经被开启,并且处于任务栈的栈顶,就不会创建新的Activity,而是复用这个已经开启的Activity。如果Activity存在但是没有位于栈顶,则会创建一个新的Activity。能保证栈顶的Activity唯一
    • SingTask:单一栈顶
      • 在整个任务栈里只允许有一个当前的Activity实例存在。
      • 如果要开启的Activity在任务栈中已经存在,直接复用这个已经存在的Activity,并且把这个Activity上面的其他Activity全部清空
    • SingInstance:单一任务栈
      • 整个操作系统只有一个实例存在,并且是运行在自己的单独任务栈里边。
      • 应用场景:通话界面的Activity。
      • 特点:一个acti独享一个任务栈,其他任务栈进不来,如果调用其他Activity,就会创建一个新的任务栈

  • 数据回传

  • 智能短信:

    • 步骤:

      • 定义一个UI,
      • 在mainactivity写点击事件

        • 选择号码,快速回复 按钮,点击跳转到选择号码页面
        • 跳转拿数据调用startActivityForResult(intent,大于等于0的数(请求码,用于区分请求)) ,

          • 该方法用于请求目标Activity返回的数据,当目标Activity销毁的时候我们就收到目标Activity返回的数据
                   //该方法用于请求目标Activity返回的数据,当目标Activity销毁的时候我们就能收到目标Activity设置的返回的结果数据
                   //参数2:请求码,用于区分请求。
          
          startActivityForResult(new Intent(this, SelectNumActivity.class), REQUEST_NUM);
        • 在跳转的页面

          • 给listview添加条目点击事件
            • 调用setOnItemClickListenter();
            • 当listview中的某个条目被点击时,listview就回调该方法OnItemClick()
              • 参数1:就是点击的listview对象本身listview
              • 参数2:点击条目
              • 参数3:点中条目的角标
              • 参数4:点中条目的Id等于角标
            • 获取点击数据num,调用.get(position)
            • 将num设置出去调用setResult(返回的结果码int,获取的数据inten)
            • 将自己finish();关闭掉
        lvNum.setOnItemClickListener(new OnItemClickListener() {
        
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            String smsString = list.get(position);
            Intent intent = new Intent();
            Intent data = intent.putExtra("sms", smsString);
            setResult(2,data);
            finish(); 
        }});
        
        - 注意:直接点击返回键,回调了该方法,只是没有获取数据
        
      • 数据回调
      • 在跳转页面时,获取传过的数据要重写onActivityResult()方法
        • 该方法跟startActivityForResult()方法配合使用,当startActivityForResult()方法启动的Activity销毁时,系统就会调用该方法
        • 参数1:请求码,就是startActivityForResult中的第二个参数
        • 参数2:目标Activity在setResult()时,传入的结果码
        • 参数3:目标Activity在setResult(1, dataIntent)时,的第二个参数
      @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      
              super.onActivityResult(requestCode, resultCode, data);
              if (requestCode == RETURN_NUM) {
                  if (data != null) {
                      // 获取传过来的值
                      String num = data.getStringExtra("num");
                      ed_num.setText(num);
                  } else {
                      Toast.makeText(this, "号码不能为空", Toast.LENGTH_LONG).show();
                  }
              } else if (requestCode == RETURN_SMS) {
                  if (data != null) {
                      ed_sms.setText(data.getStringExtra("sms"));
                  } else {
                      Toast.makeText(this, "短信内容为空", Toast.LENGTH_LONG).show();
                  }
      
              }
          }
    • 发送短信(在MainActivity页面中)

      • 获取一个SMSMessage对象
      • 获取要发送的手机号,也就是获取numedittext的内容
      • 获取要发送的内容smsedittext的内容
      • SMSMessage对象调用sendTextMessage()方法进行发送短信
        • 参数1:目标地址
        • 参数2:短信中心的地址
        • 参数3:短信的内容
    smsManager.sendTextMessage(address, null, smsString, null, null);



intent的作用:

暂时把Intent看做一个媒介,一个数据载体。它可以打开四大组件,可以在组件之间传递数据。Intent可以传递八大基本数据类型和序列化接口过的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值