之前在博客上看到一篇关于技能清单的列表,觉得言之有理,果断转过来。现在陆陆续续复习或者学习一遍,记录下来,方便随时温习。
Activity相关
提到Activity,首先想到的居然是Intent,好吧,不知道为啥。intent是啥勒,是个通讯工具,于组件之间传递各种消息,启动activity,broadcast,service啊什么的。
启动activity分两种
一种是startactivity() 直接启动另一个activity。
另一种是 startactivityForResult() 要获取返回值的启动。通过重写onActivityResult()来获取返回值。在启动的时候定义一个int类型的返回值,这个值由开发者自行定义。在新打开的activity关闭后,会返回结果。
在第一个Activity中
第一个事件:
//第二个参数为请求码,自行定义
startActivityForResult(new Intent(MainActivity.this, SecondActivity.class), REQUEST_CODE1);
//第二个事件:
startActivityForResult(new Intent(MainActivity.this, SecondActivity.class), REQUEST_CODE2);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//根据requestCode区分是事件1的返回还是事件2的返回
//根据resultCode区分是第二个Activity还是第三个Activity
//这里获取返回的数据
data.getExtras().getString("result");
}
第二个Activity关闭之前
Intent intent = new Intent();
//加入返回的数据
intent.putExtra("result", "返回的数据");
//这里有个结果码,也是自行定义
SecondActivity.this.setResult(RESULT_CODE1, intent);
SecondActivity.this.finish();
第三个Activity关闭之前
Intent intent = new Intent();
//加入返回的数据
intent.putExtra("result", "返回的数据");
//这里有个结果码,也是自行定义
SecondActivity.this.setResult(RESULT_CODE2, intent);
SecondActivity.this.finish();
上面提到了两个码,一个是请求码,一个是结果码。请求码的作用是为了区分从哪个事件开启的新activity。结果码是区分是哪个Activity结束后返回的结果。
- activity生命周期
这个的话我觉得小池laucherish这个里面的几幅图可以很容易的理解Activity的生命周期
了解完生命周期,我们来看看activity的四种启动模式
launchMode
提到启动模式,首先得先了解任务栈。任务栈是用来统一管理Activity的,原则是后进先出。就像一个罐子,Activity是放进去的东西,先放进去的只有在最后才拿得出来。任务栈一般分为前台任务栈和后台任务栈,前台任务栈就是显示的时候的一个task,按home键之后他就变成后台任务栈了,很好理解。
singleInstance 单一实例,就是只有一个实例,如果一个Activity(singleInstance) intent到这个Activity,那么不会创建新的实例。而且如果启动应用之后的task1里面的Activity不是singleInstance,那么跳转到singleInstance的Activity,那么就会多出一个task2用来装这个Activity,他跳转回task1中的Activity之后,返回键返回不到task2中的Activity来。
singleTask 单一任务,也是一个Activity只有一个实例,那么跟singleInstance的区别在于,singleInstance是在单独的任务栈中启动Activity,而singleTask是只在一个栈中,如果要启动的这个Activity已经有了实例,那么会把覆盖在其上面的所有Activity都移除,让他到栈顶显示。因此,singleTask一般运用于首页的Activity。
singleTop 单顶,就是如果要启动的Activity正好在栈顶,那么久重用,不会创建新实例。只要要启动的Activity不在栈顶,那么会跟默认的一样,创建一个新的实例。所以一般搜索界面的Activity会用到这种启动模式。
standard 标准,这种是Activity默认的启动方式。启动一次就会创建一个新的实例,有时候跳转一个界面的按钮从A到B,你手速快点点击,就会发现,你按返回键的时候会多次出现B界面。这就是因为启动一次就新建一个。启动service
首先了解一下service,service是一个在后台执行的组件,不与用户进行直接交互。其优先级低于前台应用,高于后台应用,这就使得他不容易被系统自动销毁。他的生命周期就三个,oncreate,onStartCommand和ondestory。service跟Activity一样也需要在清单文件中进行注册。
启动service分两种,一种是startService,一种是bindService。调用者使用startservice开启服务,服务已开启,两者之间就没有了关联,而且调用者也不能访问服务里面的方法。如果是bindService启动的服务,那么调用者会跟服务进行绑定,如果调用者销毁了,服务也挂了。
//用startservice启动服务
Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent);
//关闭服务
Intent intent = new Intent(MainActivity.this, MyService.class);
stopService(intent);
下面是用bindService启动服务
//开启服务
Intent intent = new Intent(BindActivity.this, MyService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
//通过ServiceConnection与服务进行连接
private ServiceConnection conn = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
//调用服务里面的方法
String string = ((MyService.ServiceBinder) service).method();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
下面是Service代码
public class MyService extends Service {
private ServiceBinder serviceBinder=new ServiceBinder();
@Override
public IBinder onBind(Intent intent) {
return serviceBinder;
}
class ServiceBinder extends Binder {
public String method(){
String s="服务里的一个方法";
return s;
}
}
}
- 发送广播
广播是所有应用都可以接收的一种消息,不管是同一个app的组件之间还是不同的app之间都可以通信。
要使用广播,首先得注册,注册分静态注册和动态注册。静态注册是直接在清单文件中注册
这里写代码片