Android后台运行的解决方案,不需要交互,长期运行。
服务基础框架:
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
//activity与service交互(需要继承)
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
public void onCreate(){
//创建服务时定义
super.onCreate(); }
public int onStartCommand(Intent intent,int flags,int startId)
{
//启动服务时调用
return super.onStartCommand(intent,flags,startId);
}
public void onDestroy(){
//销毁服务时调用
super.onDestroy();
} }
Android多线程:
方法一:
①继承Thread,重写run()方法
Class MyThread extends Thread{
Public void run( ){ // 处理具体的逻辑}
}
②启动线程,new MyThread( ).start( );
方法二:
①使用Runable 接口定义线程
Class MyThread implements Runnable{
Public void run( ) {// 处理具体的逻辑 }
}
②启动线程,
MyThread myThread = new MyYhread( );
New Thread(my Thread ).start( );
匿名类简写:
在子线程中更新UI:
如果直接在子线程中修改UI会导致系统崩溃,因为UI线程是不安全的。所以采用异步消息处理机制。示例:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
public static final int UPDATE_TEXT=1;
private TextView text;
private Handler handler = new Handler(){
public void handleMessage(Message msg)
{
switch (msg.what){
case UPDATE_TEXT:
//UI修改部分
text.setText("NICE TO MEET YOU");
break;
default:
break; } } };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.text);
Button changeText= (Button) findViewById(R.id.change_text);
changeText.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.change_text) {
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);
}
}).start();
}
}
}
异步消息处理机制:主要由4个部分组成:Message、Handler、MessageQueue和Looper。
Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交
换数据。上一小节中我们使用到了Message的what字段,除此之外还可以使用arg1和arg2字段来携带一些整型数据,使用obj字段携带一个 object对象。
Handler顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消息一般是
使用Handler 的sendMessage()方法, 而发出的消息经过一- 系列地辗转处理后,最终会传递到Handler的handleMessage()方法中。
MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个MessageQueue对象。
Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到
一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中。每个线程中也只会有一个Looper对象。
异步消息封装工具AsyncTask:
AsyncTask抽象类,需要子类继承,一共三个泛型
简单定义AsyncTask:
Class DownloadTask extends AsynTask<Void, Integer, Boolean >{....}
这里我们把AsyncTask的第-一个泛 型参数指定为Void,表示在执行AsyncTask的时候不需
要传人参数给后台任务。第二个泛型参数指定为Integer,表示使用整型数据来作为进度显示单位。第三个泛型参数指定为Boolean, 则表示使用布尔型数据来反馈执行结果。
经常需要重写onPreExecute( ),doInBackground(params.. ),
onProgressUpdate(params.. ), onPostExecute(Result)
前台服务:会一直有一个正在运行的图标在系统状态栏显示。
IntentService类封装了自动开启线程,调用stopSelf( )方法。