此博客为学习Android开发的笔记型博客,若有不妥或补充之处希望各位大神给予指正
服务
服务是Android中实现程序后台运行的解决方案。 服务并不是独立运行在一个进程中的,而是依赖于创建服务时所在的应用程序进程。即需要在服务内部手动创建子线程。
多线程
创建子线程:
1.新建MyThread类实现Runnable接口: 重写run( )方法
class MyThread implements Runnable{
@Override
public void run(){
}
}
2.匿名类:
new Thread(new Runnable() {
@Override
public void run() {
Message message=new Message();
message.what=CHANGE_UI_TEXT_MSG;
handler.sendMessage(message);
}
}).start();
在子线程中更新UI
要想更新应用程序里的UI元素,必须在主线程中进行,否则就会出现异常。 那么如果一定要在子线程中进行修改UI呢? 这时我们可以使用异步消息处理机制。 1.Handler,负责处理消息和发送消息
final Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case CHANGE_UI_TEXT_MSG:
TextView textView=(TextView) findViewById(R.id.first_text_1);
textView.setText("Nice to meet you");
break;
default:
break;
}
}
};
2.在子线程中用Message传递信息
new Thread(new Runnable() {
@Override
public void run() {
Message message=new Message();
message.what=CHANGE_UI_TEXT_MSG;
handler.sendMessage(message);
}
}).start();
异步消息处理机制
1.Message: Message是在线程之间传递的消息,它可以在内部携带少量的信息。 使用Message.what 2.Handler: 发送和处理消息。 发送:sendMessage() 处理:handleMessage() 3.MessageQueue: 消息队列,用于存放所有通过Handler发送的消息。每个线程只会有一个MessageQueue对象 4.Looper: Looper是每个线程中的MessageQueue管家,调用Looper的loop()方法后,就会进入到循环中,然后每发现一个Message就会取出,然后传递到Handler的handleMessage()方法。每个线程只会有一个Looper对象
使用AsyncTask
新建一个类继承AsyncTask,继承时可以指定3个泛型参数: Params:执行AsyncTask时需要传递的参数 Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛?型作为进度单位。? Result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。
class DownloadTask extends AsyncTask<Void,Integer,Boolean>{
需要重写的方法: protected void onPreExecute() : 这个方法会在后台任务开始执行之前调用,用于进行一些界面上的初始化操作
protected Boolean doInBackground(Void… params) : 这个方法所有的代码都会在子线程中运行,在这里写处理逻辑。 注意,在这个方法中是不可以进行 UI操作的,如果需要更新 UI 元素,比如说反馈当前任务的执行进度,可以调用 publishProgress(Progress…)方法来完成。
protected void onProgressUpdate(Integer… values): 当在后台任务中调用了 publishProgress(Progress…)方法后,onProgressUpdate(Progress.。.)方法就会很快被调用,该方法中携带的参数就是在后台任务中传递过来的。在这个方法中可以对 UI进行操作。利用参数中的数值就可以对界面元素进行相应的更新。
protected void onPostExecute(Boolean aBoolean) : doInBackground方法return后调用。
服务的用法
创建服务
1.新建服务
public class MyService extends Service {
public MyService() {
}
}
2.重写方法
onCreate() :服务创建时调用 onStartCommand(Intent intent, int flags, int startId) :服务被调用时调用 onDestroy() :服务销毁时调用 onBind(Intent intent):与活动绑定时调用 onUnbind(Intent intent):与活动解绑时调用
3.启动服务:
Log.d(TAG, "onClick: "+"开启服务");
Intent intent=new Intent(FirstActivity.this,MyService.class);
startService(intent);
startService(intent);
4.关闭服务:
stopService(intent);
活动和服务进行通信
1.在Service中新建Binder类:
public class MyService extends Service {
private MyBinder myBinder=new MyBinder();
class MyBinder extends Binder{
public void onstartBind(){
Log.d(TAG, "onstartBind: "+"绑定成功");
}
}
2.重写onBind方法:
@Override
public IBinder onBind(Intent intent) {
return myBinder;
}
3.在活动中新建Binder实例:
private MyService.MyBinder myBinder;
4.新建ServiceConnection实例: 重写onServiceConnected()方法和onServiceDisconnected()方法。
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder=(MyService.MyBinder) service;
myBinder.onstartBind();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
5.连接和解绑:
Intent intent=new Intent(FirstActivity.this,MyService.class);
bindService(intent,connection,BIND_AUTO_CREATE);
unbindService(connection);
使用IntentService
IntentService保证了每个服务的具体方法在子线程中进行。可以简单地创建一个异步的,会自动停止的服务。
重要的方法:
1.构造方法
public MyIntentService() {
super("MyIntentService"); //必须在其内部调用有参的构造函数
}
2.onHandleIntent(): 在子线程中处理具体的逻辑
3.onDestroy(): onHandleIntent()方法return后该服务会自动停止,在停止前调用此方法。
|