监听事件
版权声明:
本文为博主学习整理原创文章,如有不正之处请多多指教。
未经博主允许不得转载
https://mp.csdn.net/postedit/81838521
点击事件
关键字:onclickListener
控件点击时会触发该事件。
- 使用流程
- 控件添加唯一标识
在布局文件中对需要监听的控件添加id。代码示例如下:
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
- 获取控件
关键字:findViewById(id)方法。代码示例如下:
Button btn= (Button) this.findViewById(R.id.btn);
- 绑定监听事件
关键字:setOnClickListener()
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
- 业务逻辑
以弹出信息(吐司 )为例:
Toast.makeText(MainActivity.this, "这是点击后提示框", Toast.LENGTH_SHORT).show();
- Toast
一种简易的浮动的消息提示框。它永远不会获得焦点,无法被点击,而且Toast显示的时间有限,Toast会根据用户设置的显示时间后自动消失。
- 使用
- 长时间显示
Toast.makeText(MainActivity.this, "这是点击后提示框", Toast.LENGTH_LONG).show();
- 短时间显示
Toast.makeText(MainActivity.this, "这是点击后提示框", Toast.LENGTH_SHORT).show();
- 界面Activity
Activity就是布满整个窗口或者悬浮于其他窗口上的交互界面。在一个应用程序中通常由多个Activity构成,每写一个activity必须在AndroidManifest.xml中注册。
- 位置
以主界面MainActivity为例:
src目录包名下的Java文件,继承自Activity
关键代码摘录如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
-
- 注册
以MainActivity的注册为例:
摘录配置如下:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
-
- 生命周期
四个状态(运行、暂停、停止、死亡)、七个方法,如图
在Activity中重写父类的不同周期状态的方法
- onCreate() 创建:后台创建Activity,并分配运行资源
- onStart() 开始运行:后台Activity转为前台运行
- onResume() 继续运行(运行中):前台Activity获取焦点
- onPause() 暂停运行:前台Activity失去焦点
- onStop() 停止运行:前台Activity转为后台运行
- onRestart() 重新运行:后台Activity重新转为前台运行
- onDestroy() 销毁:释放运行资源
- 跳转
关键字:intent
-
-
- 显式跳转
-
// 设置参数(1源Activity,2目的Activity.class):Activity跳转的参数
Intent intent = new Intent(MainActivity.this, SucceedActiviry.class);
// 开始Activity之间的跳转
startActivity(intent);
-
-
- 隐式跳转
-
// 初始化一个Intent时就设置Activity跳转的参数(1调用的权限,2传递的参数)
// 设置的参数:1调用拨打电话的功能,2传递拨打的号码
// 该权限需要在AndroidManifest.xml文件中声明
// <uses-permission android:name="android.permission.CALL_PHONE" />
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:110"));
// 开始Activity之间的跳转
startActivity(intent);
-
- 跳转时数据通信
我们可以在跳转时,实现数据的传递。如登录成功后,把登录后的用户信息传递给下一个界面。关键字:Bundle
bundle相当于map类,通过(key,value)方式描述数据。
-
-
- 传递数据
-
Bundle bundle = new Bundle();
//向Bundle中添加数据,需指定key(key必须唯一,不然会覆盖值),不同的数据类型使用不同的方法
bundle.putString("name", “xxx”);
bundle.putInt("age", 15);
//把Bundle对象添加到Intent对象中,就可以通过Intent对象的跳转传递数据
intent.putExtras(bundle);
-
-
- 解析数据
-
//获取bundle
Bundle bundle = this.getIntent().getExtras();
//通过键获取对应的值
String name= bundle.getString("name");
int age = bundle.getInt("age");
-
- Intent类(回调传值)
关键字:
StartActivityForResult(Intent,requestCode) //在待获取数据界面
onActivityResult(requestCode,resultCode,date)//在待获取数据界面
setResult(resultCod,Intent) // 在生成数据界面
使用Intent请求数据
// 初始化一个Intent时就设置Activity跳转的参数
Intent intent = new Intent(MainActivity.this, SucceedActiviry.class);
// 开始Activity之间的跳转,必须指定请求码,被请求端根据请求码区分不同的请求
startActivityForResult(intent, 3); //3: requestCod(请求码)
//如果执行带请求码的跳转,必须重写onActivityResult()方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 4) {
//获取Bundle数据
Bundle bundle = data.getExtras();
String user = bundle.getString("user");
edtUser.setText(user); //设置显示内容
}
}
使用Intent发送数据
//获取用户名和密码
String user = edtUser.getText().toString().trim();
String pwd = edtPwd.getText().toString().trim();
//保存数据到Bundle
Bundle bundle = new Bundle();
bundle.putString("user", user);
bundle.putString("pwd", pwd);
//创建Intent对象
Intent intent = new Intent();
//把数据放入Intent对象中
intent.putExtras(bundle);
//设置带返回码的请求
setResult(RESULT_CODE, intent);
//关闭本地Activity
finish();
-
- 权限管理
当程序需要调用Android系统中权限时,需要声明申请批准的权限。声明权限如下:
在AndroidManifest.xml文件中添加代码
//声明需要批准的权限为name中的字段,此段代码为添加拨打电话的功能
<uses-permission android:name="android.permission.CALL_PHONE" />
常见权限汇总可参考Android常用的权限介绍.txt文档
- BroadcastReceiver
监听系统广播或者用户自定义广播,在接收到广播之后做出响应处理。
-
- 完整思路
- 继承BroadcastReceivre基类
任何广播都需要继承实现BroadcastReceiver类,该类为abstract抽象类。代码摘录如下:
// 继承BroadcastReceivre基类
public class MyReceiver extends BroadcastReceiver {
// 复写onReceive()方法
// 接收到广播后,则自动调用该方法
@Override
public void onReceive(Context context, Intent intent) {
//写入接收广播后的操作
}
}
- 必须复写抽象方法onReceive()方法
广播接收器接收到相应广播后,会自动回调 onReceive() 方法
一般情况下,onReceive方法会涉及 与 其他组件之间的交互,如发送Notification、启动Service等
默认情况下,广播接收器运行在 UI 线程,因此,onReceive()方法不能执行耗时操作,否则将导致ANR
- 注册广播
动态注册。注册方式:在代码中调用Context.registerReceiver()方法,代码示例如下:
// 1. 实例化BroadcastReceiver子类 & IntentFilter
MyReceiver mBroadcastReceiver = new mBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.ACTION_NETWORK);
// 2. 动态注册:调用Context的registerReceiver()方法
registerReceiver(mBroadcastReceiver, intentFilter);
- 取消注册
在界面Activity销毁的时候需要取消注册该广播,否则会内存泄漏。
unregisterReceiver(mBroadcastReceiver);