Activity的生命周期:
生命周期:一个对象从创建到销毁中间经历的状态。
Activity状态迁移调用哪些方法:
创建 —— 》 运行 (可见、可操作) :onCreate() onStart() onResume()
运行 ---》 销毁 (关闭): onPause() onStop() onDestroy()
运行 ---》 暂停 (可见、不可操作): onPause()
恢复到运行状态: onResume()
运行 ---》 停止 (不可见、又不可操作) onPause() onStop()
恢复到运行状态: onRestart() onStart() onResume()
注意:当Activity处于暂停或停止状态,更高优先级的应用需要内存的话,
Activity就有可能被杀死掉。
数据持久化:把数据保存在外存。
内存:RAM 掉电内容被清空掉
外存:ROM 硬盘 U盘 光盘 SDCard
利用生命周期去保存状态:
1、onStop() 保存数据
2、onStart() 恢复数据
Android读写sdcard:
1、权限(当调用到系统的服务或则硬件的时候要申请权限)
清单文件 ——》 permission --》add --》 usepermission
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2、sdcard路径:“/mnt/sdcard/xxx.xx”
四大组件之一:
service:服务:运行在后台没有界面。
创建service要素:
1、创建的类继承service
2、重写onbind()方法;
3、在清单文件里面注册:<service android:name = "包名 + 类名">
启动service的方法:
在activity里面调用:startservice(intent);
启动服务调用的生命周期: onCreate() onstartcommand();
注意:第一次开启服务的时候会调用:onCreate() onstartcommand();
在没有结束服务之前再次开启只会调用onstartcommand();
注意:用startservice()开启的服务跟activity的关系比较松散,
不会随着activity的关闭而关闭。
关闭service的方法:
stopService();
绑定service的方法:
Intent service = new Intent();
service.setClass(this, MyService.class);
bindService(service , conn, Context.BIND_AUTO_CREATE);
参数:第一个:intent对象
第二个:serviceconnection(必须声明成成员变量)
第三个:Context.BIND_AUTO_CREATE
(调用绑定服务时,如果没有开启服务,则会自动开启服务)
注意:通过bindservice()方法开启的服务跟activity连接比较紧密,
会随着activity的关闭而关闭
注意:在service里面,onBind()必须有个返回值,没有的话返回null
service:生命周期: oncreate() onBind()
解除绑定:
unbindService(conn);
参数:必须是bindservice()调用的第二个参数对象
注意:当我们先用startservice()开启一个服务之后,再绑定服务,
我们关闭activity,service不会随之关闭,只会解除绑定。
Activity通过绑定的方式得到Service里面的方法:
1、在Activity里面得到IBinder类型的对象:
a、在service里面声明一个类Mybinder,继承Binder
b、在Mybinder这个类里面创建一个方法区调用service里面的方法
c、在onBind()里面返回MyBinder类型的对象
d、在activity里面的ServiceConnection接口里面的onServiceconnnected()
接收。但是我们得到是一个Binder类型的对象,所以要强制转换为
Mybinder类型的。
Mybinder mybinder = (Mybinder)service;
通过mybinder对象就可以得到service里面方法返回的结果
注意:onServiceconnnected()能被调用的前提是service里面onBind()
返回一个非空的对象。
BroadcastReceiver 广播接收者
广播:Android系统里面信息传递都是以广播的形式(短信、电话……)
系统接收外部的信息可以发送广播;
应用本身也可以发送广播:
Intent intent = new Intent();
//设置广播的过滤条件
intent.setAction("com.xinbo.www");
//发送广播
sendBroadcast(intent );
接收广播:广播接收者。
创建:
1、继承BroadcastReceive
2、在清单文件里面注册
3、在清单文件里面设置要接收的广播的过滤条件
onReceive()接收。
-----------------------------------------------------------------
1、接收系统广播: 接收短信
1、权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
2、过滤条件:
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
2、在code配置广播接收者的过滤条件:
1、获取广播接收者对象:
MyReceiver myReceiver = new MyReceiver();
2、选一个时机注册广播(一般在onstart()里面)
//设置过滤条件
IntentFilter filter = new IntentFilter();
filter.addAction("com.xinbo.www");
//注册广播接收者
registerReceiver(myReceiver, filter );
3、选一个时机注销广播(一般在onStop()里面)
unregisterReceiver(myReceiver);
两种广播注册的区别:
1)清单文件注册 : 就算应用程序进程不存在,只要有匹配的广播就能接收。
2)在代码里面注册: 比较灵活,可以自己控制时机。
Intent
显示意图: 明确的指定的类名
隐式意图: 没有明确指定类名,但是指定了过滤条件
隐式意图打开activity:
1、在发隐式意图的activity里面:
Intent intent = new Intent();
intent.setAction("org.yinan.www");
startActivity(intent );
2、在要打开的activity所在应用的清单文件里面配置activity的过滤条件
<intent-filter>
<action android:name="xxx.xxx.xxx" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
思考:通过隐式意图开启另外一个应用的service
1、通过隐式意图开启activity、然后通过activity去开启service
2、通过隐式意图启动service
显示意图跟隐式意图的区别:
显示:启动目标:1个 (直接打开) 必须在同一个应用里面
隐式:启动目标:多个 (多个的话出现选择列表) 可以跨应用
中级:
1、Android里面的通知系统
作用:把一些应用的重要信息告知给用户。
Toast :一般是在屏幕下方的黑色方框,显示一段时间后消失。
Toast特性:
1、Toast提示消息是不会获取焦点
2、Toast提示消息过段时间会自动消失,不需要用户确认反馈。
3、Toast提示消息在应用的其他页面还会存在,知道提示时间到了自动消失
具体实现方法:
1、通过Toast的静态方法makeText()创建一个Toast对象
Toast.makeText(MainActivity.this, "提示一", Toast.LENGTH_LONG)
参数:context: 指向activity本身
Text: 文本:消息内容
duration: 提示的时间: Toast.LENGTH_LONG 长
Toast.LENGTH_SHORT 短
2、得到对象之后记得要调用show();
2、Notification:是显示在手机状态栏上面的通知。代表一种具有全局效果的通知。
作用:来消息的时候在通知栏上面显示信息,当用户点击通知,
就会打开一个界面显示详细信息
使用场景: 时效性不是很强的消息
步骤:
//1、得到一个消息管理器
mManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//2、创建一个消息对象
Notification notification =
new Notification(R.drawable.ic_launcher, "通知一",
System.currentTimeMillis());
//3、设置关联的Activity
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);
//第四个参数:PendingIntent.FLAG_UPDATE_CURRENT
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent , 0);
//4、设置消息对象的具体内容
notification.setLatestEventInfo(this, "title", "message!",
contentIntent );
//消息被点击后消失
notification.flags = Notification.FLAG_AUTO_CANCEL;
//消息被点击后不会消失
notification.flags = Notification.FLAG_ONGOING_EVENT;
//5、通过消息管理器发送消息
mManager.notify(123, notification );
取消通知:
mManager.cancel(123);
3、对话框
第一种:
//获取一个辅助类Builder对象
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//设置对话框内容
builder.setTitle("对话框");
builder.setMessage("通知一!!!!");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "对话框点击事件", Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("取消", null);
builder.setNeutralButton("应用", null);
//创建对话框对象
AlertDialog dialog = builder.create();
//把对话框展示出去
dialog.show();
第二种:
(1)执行showDialog(id);
(2)重写onCreateDialog()
返回一个dialog对象。
菜单:
1、选项菜单:optionmenu;
(1) a、在onCreateOptionsMenu():
menu.add(0, 1, 0, "设置").setIcon(R.drawable.ic_launcher);
b、点击事件:
onOptionsItemSelected():
(2)xml
a、在onCreateOptionsMenu():
//菜单布局转换器
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.one, menu);
b、点击事件:
onOptionsItemSelected():
2、上下文菜单:ContextMenu
步骤:
a、为某个控件注册上下文菜单:registerForContextMenu(控件对象)
b、在Activity里面重写onCreateContextMenu();
根据控件的id 进行添加
c、点击事件:onContextItemSelect();
选项菜单跟上下文菜单的区别:
1)触发方式不一样:选项菜单按menu键,上下文菜单要长按(比较隐蔽)
2)弹出方式也不一样:选项菜单在界面底部。上下文菜单在界面中间
3)作用范围也不一样:选项菜单:Activity。上下文菜单:view
4)创建的时候调用创建方法的次数也不一样:
onCreateOptionmenu() 只有第一次创建的时候调用一次
onCreateContextMenu() 每次触发就会被调用