Android课堂笔记(三)——生命周期、处理事件、intent

目录

一.生命周期

1.生命周期三种状态

2.生命周期回调方法

3.注册活动(将UI组件与活动关联)

4.打印日志显示生命周期

5.综合实例

二.使用 Activity 类处理用户界面事件

1.处理事件方法分类

2.使用事件处理程序(基于回调的事件处理)

3.使用事件侦听器(基于监听的事件处理)

三.激活应用组件 intent

1.intent意图

2.intent提供方法

3.intent组件

3.1 组件名称(ComponentName)

3.2 操作(Action)

3.3 数据(Data)

3.4 类别(Category)

3.5 额外内容(Extras)

3.6 标志(Flags)

4.intent类型

5.Bundle对象


一.生命周期

1.生命周期三种状态

  • 一个应用可以具有多个活动,启动应用时向用户显示的活动称为 主活动
  • 活动具有生命周期,在此期间活动可获得各种状态
  • Activity 类提供 生命周期回调方法,用于状态转换,帮助管理活动状态
  • 生命周期三种状态:
  1. 正在运行(Running/Resumed) :活动对于用户在屏幕上可见,用户可与活动交互
  2. 已暂停(Paused) :另一活动获得用户的焦点,此活动仍旧可见,但没有覆盖整个屏幕
  3. 已停止(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.处理事件方法分类

  1. 通过使用事件处理程序(基于回调的事件处理) :一般用于通用性的事件
  2. 通过使用事件侦听器(基于监听的事件处理):一般用于特定的事件

2.使用事件处理程序(基于回调的事件处理)

  • 常见方法(注意参数!)
  1. onKeyDown(int, KeyEvent) :键盘被按下
  2. onKeyUp(int, KeyEvent) :键盘被松开
  3. onTrackballEvent(MotionEvent) :球形轨迹运动
  4. onTouchEvent(MotionEvent) :触摸屏事件
  5. 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类提供各种接口,被称作事件侦听器
  • 常见方法:
  1. View.OnClickListener:点击事件,不常用
  2. View.OnLongClickListener:长按点击事件,常用
  3. View.OnFocusChangeListener:焦点改变事件
  4. View.OnKeyListener:键盘通用事件
  5. View.OnTouchListener:触摸屏事件
  6. 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)

  • 指定需要执行的操作,部分操作常量为:
  1. ACTION_CALL:拨打电话,但不显示拨号器
  2. ACTION_DIAL:拨打电话,显示拨号器
  3. ACTION_EDIT:使用户能够编辑数据
  4. ACTION_MAIN:作为主入口点启动,不需要数据
  5. ACTION_BATTERY_LOW:电量过低
  6. ACTION_HEADSET_PLUG:耳机是否已插设备或已从设备拔出
  7. ACTION_SCREEN_ON:屏幕已被开启
  8. 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 中书写,若不书写,会导致活动无法应用
  1.     <uses-permission android:name="android.permission.CALL_PHONE"/>
  2.     <uses-permission android:name="android.permission.SEND_SMS"/>

3.3 数据(Data)

  • 指定要执行操作的数据,和 Action 搭配使用

3.4 类别(Category)

  • 指定目标应用组件的行为,和 Action 搭配使用,部分类别约束为:
  1. CATEGORY_BROWSABLE:能 被浏览器安全使用的活动 必须支持这个类别
  2. CATEGORY_HOME:回到主屏幕
  3. 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)

  • 控制与激活 新组件相关的 各方面的标志,部分标志约束为:
  1. FLAG_FROM_BACKGROUND:进入后台,用户不可见
  2. FLAG_GRANT_READ_URI_PERMISSION:指示 Intent的接受方 应被授予对 数据的读访权限

4.intent类型

  1. 显示intent:指定目标组件名称,用于 同一应用内部 传递信息
  2. 隐式intent:不指定目标组件名称,用于 不同应用之间 传递信息

5.Bundle对象

  • Bundle对象以 键值对 的形式存储数据,可以参照Map对象
  • Bundle对象的两个方法:
  1. 存入 bundle.putXXX()
  2. 取出 bundle.getXXX()
  • 创建 UI 后,执行以下步骤在仿真器上查看 UI:
  1. 创建活动:activity_main.xml 中书写各种 UI 组件
  2. 将 UI 与活动关联:MainActivity.java 中书写 setContentView(R.layout.activity_main)
  3. 注册活动:系统配置文件中 注册活动(一般自动生成)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的Android运动App的代码,其中涉及了Activity、Intent事件处理: MainActivity.java ```java import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { private Button startButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startButton = findViewById(R.id.start_button); startButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, ExerciseActivity.class); startActivity(intent); } }); } } ``` ExerciseActivity.java ```java import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; public class ExerciseActivity extends AppCompatActivity { private TextView timerTextView; private Button startButton; private Button stopButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_exercise); timerTextView = findViewById(R.id.timer_text_view); startButton = findViewById(R.id.start_button); stopButton = findViewById(R.id.stop_button); startButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Start timer } }); stopButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Stop timer } }); } } ``` activity_main.xml ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/start_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start Exercise" android:layout_centerInParent="true"/> </RelativeLayout> ``` activity_exercise.xml ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/timer_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="00:00:00" android:layout_centerInParent="true"/> <Button android:id="@+id/start_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start" android:layout_below="@id/timer_text_view"/> <Button android:id="@+id/stop_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stop" android:layout_toEndOf="@id/start_button" android:layout_alignBaseline="@id/start_button"/> </RelativeLayout> ``` 这个App包含两个Activity,MainActivity和ExerciseActivity。MainActivity是应用程序的主活动,它包含一个“开始运动”按钮,点击该按钮会打开ExerciseActivity。ExerciseActivity是运动活动,它包含一个计时器和“开始”、“停止”按钮。 当用户点击MainActivity上的“开始运动”按钮时,MainActivity会创建一个Intent对象,并使用startActivity()方法启动ExerciseActivity。在ExerciseActivity中,当用户点击“开始”按钮时,计时器会开始计时。当用户点击“停止”按钮时,计时器会停止计时。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lyrelion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值