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横竖屏切换时不影响生命周期,也就是不再重新创建:
-
固定方向:
- 清单文件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,就会创建一个新的任务栈
- standard():默认模式
数据回传
智能短信:
步骤:
- 定义一个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();关闭掉
- 给listview添加条目点击事件
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可以传递八大基本数据类型和序列化接口过的对象。