目录
一.生命周期
1.生命周期三种状态
- 一个应用可以具有多个活动,启动应用时向用户显示的活动称为 主活动
- 活动具有生命周期,在此期间活动可获得各种状态
- Activity 类提供 生命周期回调方法,用于状态转换,帮助管理活动状态
- 生命周期三种状态:
- 正在运行(Running/Resumed) :活动对于用户在屏幕上可见,用户可与活动交互
- 已暂停(Paused) :另一活动获得用户的焦点,此活动仍旧可见,但没有覆盖整个屏幕
- 已停止(Stopped) :该活动被另一活动完全遮盖,且现处于后台中
2.生命周期回调方法
- onCreate() :启动活动时调用,执行初始化操作,如创建视图和填充列表(整个)
- onStart(): 此使活动 对用户可见之前 调用(可见)
- onResume(): 活动开始 与用户交互之前 调用(前台)
- onPause():另一活动 即将获得用户焦点时调用(前台)
- onStop():活动 不再对用户可见时 调用(可见)
- onRestart():活动从已停止状态 再次启动时 调用
- onDestroy():活动即将被销毁时调用(整个)
3.注册活动(将UI组件与活动关联)
- 注册活动:就是将 activity_main.xml布局文件 定义的 UI组件 与 MainActivity.java当前活动页面 关联
4.打印日志显示生命周期
- shift+alt+s = 右键source = 重写方法
// 在主活动界面显示活动生命周期 MainActivity.java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 将 UI组件和活动相关联 Log.i("activity的生命周期", "onCreate()"); // 打印日志,不要忘记双引号,否则报错 @Override protected void onStart() { super.onStart(); Log.i("activity的生命周期", "onStart()"); } @Override protected void onResume() {...} @Override protected void onPause() {...} @Override protected void onStop() {...} @Override protected void onDestroy() {...} @Override protected void onRestart() {...}
- 完成代码后运行程序,选择DDMS,左下角新建过滤器,输入关键词:“activity的生命周期”,筛选相关日志信息
- 查看打印日志效果:
5.综合实例
- MainActivity.java / Activity2.java:
// MainActivity.java 主活动界面 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册活动 Log.i("activity的生命周期", "onCreate()"); // 打印日志 // 根据 id寻找按钮 点击后跳转到第二个活动窗口,利用intent() Button button=(Button)findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { // 创建事件监听 @Override public void onClick(View v) { // intent:意图,相当于信差 Intent intent = new Intent(MainActivity.this,Activity2.class); startActivity(intent); }}); // 根据 id寻找按钮 点击后退出app,利用finish() Button button1=(Button)findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { // 创建事件监听 @Override public void onClick(View v) { finish(); // 点击后退出app }}); } // Activity2.java 活动界面2 主活动界面中,单击 button后 跳转的目标界面 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_activity2); // 注册活动 // 根据 id寻找按钮 Button button2 = (Button)findViewById(R.id.button2); button.setOnClickListener(new OnClickListener() { // 创建事件监听 @Override public void onClick(View v) { finish(); // 点击后会返回主活动界面 }}); }
- activity_main.xml:
<!-- activity_main.xml 主活动的布局界面 --> <Button android:id="@+id/button" ... android:text="点击我进入活动2 MyActivity" /> <Button android:id="@+id/button1" ... android:text="关闭主活动 MainActivity" /> <!-- activity_activity2.xml 第二活动的布局界面 --> <Button android:id="@+id/button2" ... android:text="点击我关闭活动2 MyActivity" />
- AndroidMainfest.xml:
<!-- AndroidMainfest.xml 系统设置文件 --> <manifest ... // 名称空间 android:versionName="1.0" > // 设置当前版本号1.0 <uses-sdk android:minSdkVersion="8" // 学习网格布局的时候要修改最小sdk为14 android:targetSdkVersion="17" /> // targetSdkVersion:表示目标sdk <application android:allowBackup="true" // allowBackup:是否允许开发者模式 android:icon="@drawable/ic_launcher" // icon:app图标 android:label="@string/app_name" // label:app名字 android:theme="@style/AppTheme" > // theme:app主题风格 <!-- 创建/注册 活动 --> <activity android:name="com.LYRELION.button.MainActivity" android:label="@string/app_name" > <intent-filter> // 创建过滤器,因为它的存在,main才会成为程序主入口 <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.LYRELION.activity.Activity2" android:label="@string/title_activity_activity2" > </activity> </application> </manifest>
二.使用 Activity 类处理用户界面事件
1.处理事件方法分类
- 通过使用事件处理程序(基于回调的事件处理) :一般用于通用性的事件
- 通过使用事件侦听器(基于监听的事件处理):一般用于特定的事件
2.使用事件处理程序(基于回调的事件处理)
- 常见方法(注意参数!):
- onKeyDown(int, KeyEvent) :键盘被按下
- onKeyUp(int, KeyEvent) :键盘被松开
- onTrackballEvent(MotionEvent) :球形轨迹运动
- onTouchEvent(MotionEvent) :触摸屏事件
- onFocusChanged(boolean, int, Rect):焦点改变事件
// MainActivity.java:创建事件处理程序 public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册活动 } @Override // 创建键盘操作事件处理程序:进行键盘操作 会出现 按下 提示框 public boolean onKeyDown(int keyCode, KeyEvent event) { // 创建提示框:(上下文路径 提示框显示的内容 提示框显示时长 show()方法展示提示框) Toast.makeText(MainActivity.this, "按下"+keyCode, Toast.LENGTH_LONG).show(); // 键盘操作后 返回提示框 return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { // 键盘松开 Toast.makeText(MainActivity.this, "松开"+keyCode, Toast.LENGTH_LONG).show(); return super.onKeyUp(keyCode, event); } @Override public boolean onTouchEvent(MotionEvent event) { // 鼠标操作 Toast.makeText(MainActivity.this, "触摸屏运动", Toast.LENGTH_LONG).show(); return super.onTouchEvent(event); } @Override public boolean onTrackballEvent(MotionEvent event) { // 球形轨迹运动 Toast.makeText(MainActivity.this, "球形轨迹运动", Toast.LENGTH_LONG).show(); return super.onTrackballEvent(event); }
3.使用事件侦听器(基于监听的事件处理)
- View类提供各种接口,被称作事件侦听器
- 常见方法:
- View.OnClickListener:点击事件,不常用
- View.OnLongClickListener:长按点击事件,常用
- View.OnFocusChangeListener:焦点改变事件
- View.OnKeyListener:键盘通用事件
- View.OnTouchListener:触摸屏事件
- View.OnCreateContextMenuListener:创建上下文事件
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册活动 Button button1 = (Button) findViewById(R.id.button1); // 获取组件 button1.setOnLongClickListener(new View.OnLongClickListener() { // 创建长按监听事件 @Override public boolean onLongClick(View v) { Toast.makeText(MainActivity.this, "匿名内部类长点击事件",Toast.LENGTH_SHORT).show(); return false; }}); EditText editText = (EditText) findViewById(R.id.editText); // 获取组件 editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { // 创建失去焦点监听事件 @Override public void onFocusChange(View v, boolean hasFocus) { Toast.makeText(MainActivity.this, "失去焦点事件"+v.getId()+hasFocus, Toast.LENGTH_SHORT).show(); }}); }
三.激活应用组件 intent
1.intent意图
- 用于 激活应用组件的消息,开启另一个活动activity,调用service 传递广播
2.intent提供方法
- startActivity():启动一个活动
- startActivityForResult():启动一个活动并要求返回数据
- onActivityResult():在此方法中获取返回的数据
3.intent组件
3.1 组件名称(ComponentName)
- 指定应处理 intent 的组件的名称
- 通过 intent 对象调用活动:Intent intent = new Intent(MainActivity.this, MyActivity.class)
- 通过 ComponentName 组件名称对象调用活动:创建intent对象,找到要调用的活动包名,将Co...装入intent
- 使用 Intent 在应用程序组件间传递数据:Bundle对象(主活动创建此对象,别的活动 get此对象)
- bundle 对象中添加键值对:bundle.putCharSequence("name", "我是天下第一");
- 通过碎片Extras 将 bundle放到 intent中:intent.putExtras(bundle);
// MainActivity.java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 1.通过 intent 对象 调用活动 简单 一行代码搞定下面方法二三行代码的事情 // Intent intent = new Intent(MainActivity.this, MyActivity.class); //2.通过 ComponentName 对象 即组件名称 调用活动 Intent intent = new Intent(); // 创建 intent对象 ComponentName componentName = new ComponentName("com.LYRRELION.component", "com.LYRELION.component.MyActivity"); // 找到要调用的活动的包名 intent.setComponent(componentName); // 将componentName组件装入intent // 使用 Intent 在应用程序组件间传递数据——Bundle对象 Bundle bundle = new Bundle(); // 创建 bundle对象 在MyActivity.java文件中 get它 bundle.putCharSequence("name", "我是天下第一"); // 向 bundle 对象中添加键值对 intent.putExtras(bundle); // 通过碎片Extras 将 bundle放到 intent中 startActivity(intent); // 调用 创建好的 intent 开启活动 }}); }
3.2 操作(Action)
- 指定需要执行的操作,部分操作常量为:
- ACTION_CALL:拨打电话,但不显示拨号器
- ACTION_DIAL:拨打电话,显示拨号器
- ACTION_EDIT:使用户能够编辑数据
- ACTION_MAIN:作为主入口点启动,不需要数据
- ACTION_BATTERY_LOW:电量过低
- ACTION_HEADSET_PLUG:耳机是否已插设备或已从设备拔出
- ACTION_SCREEN_ON:屏幕已被开启
- ACTION_TIMEZONE_CHANGED:指示时区设置已被更改
// MainActivity.java 主活动 Button telButton = (Button) findViewById(R.id.tel); // 拨打电话 telButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); // 创建 intent对象 intent.setAction(intent.ACTION_DIAL); // 设置 action动作 应和数据date 搭配使用 intent.setData(Uri.parse("tel:10086"));// 设置 date数据 startActivity(intent); // 开启活动 // 如果没有授权 就无法拨打电话 在 AndroidMainfest.xml文件中写 }}); Button SmsButton = (Button) findViewById(R.id.smsTo); // 发送短信 SmsButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setAction(intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:10086")); intent.putExtra("sms_body", "be Careful!"); // 填充发送信息内容 startActivity(intent); }});
// MyActivity.java 活动2 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); // get主程序中的 bundle对象 Intent intent = getIntent(); // Extras 包含必须传送给处理intent的 组件的键-值对形式额外信息 Bundle bundle = intent.getExtras(); String name = bundle.getCharSequence("name").toString(); // 运行后 出现 小芳提示 Toast.makeText(MyActivity.this, bundle.getCharSequence("name"), 1).show(); }
- 授权:在系统配置文件 AndroidMainfest.xml 中书写,若不书写,会导致活动无法应用
- <uses-permission android:name="android.permission.CALL_PHONE"/>
- <uses-permission android:name="android.permission.SEND_SMS"/>
3.3 数据(Data)
- 指定要执行操作的数据,和 Action 搭配使用
3.4 类别(Category)
- 指定目标应用组件的行为,和 Action 搭配使用,部分类别约束为:
- CATEGORY_BROWSABLE:能 被浏览器安全使用的活动 必须支持这个类别
- CATEGORY_HOME:回到主屏幕
- CATEGORY_LAUNCHER:活动应被显示在顶级的 launcher 中
// MainActivity.java 主活动 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button categroy = (Button) findViewById(R.id.categroy); categroy.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); // action 和 category 搭配使用 intent.setAction(intent.ACTION_MAIN); // 注意:此处是add,不是set, category_home回到主屏幕 intent.addCategory(intent.CATEGORY_HOME); startActivity(intent); }}); }
// 系统配置文件中的 过滤器 <intent-filter> <!-- action 必须出现 可以和 date/category搭配使用 --> <action android:name="android.intent.action.MAIN" /> <!-- 设置为主屏幕 category(类别) 必须和 action 搭配使用 --> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
3.5 额外内容(Extras)
- 必须传送给处理 intent 的组件的键 - 值对形式额外信息
- putExtras(Bundle bundle):主活动设置键值对
- getExtras():活动2获取主活动的设置
3.6 标志(Flags)
- 控制与激活 新组件相关的 各方面的标志,部分标志约束为:
- FLAG_FROM_BACKGROUND:进入后台,用户不可见
- FLAG_GRANT_READ_URI_PERMISSION:指示 Intent的接受方 应被授予对 数据的读访权限
4.intent类型
- 显示intent:指定目标组件名称,用于 同一应用内部 传递信息
- 隐式intent:不指定目标组件名称,用于 不同应用之间 传递信息
5.Bundle对象
- Bundle对象以 键值对 的形式存储数据,可以参照Map对象
- Bundle对象的两个方法:
- 存入 bundle.putXXX()
- 取出 bundle.getXXX()
- 创建 UI 后,执行以下步骤在仿真器上查看 UI:
- 创建活动:activity_main.xml 中书写各种 UI 组件
- 将 UI 与活动关联:MainActivity.java 中书写 setContentView(R.layout.activity_main)
- 注册活动:系统配置文件中 注册活动(一般自动生成)