Service、IntentService(不同在于:IntentService自身包含一个线程,还包含消息队列)
Service、IntentService的注册
<service android:name=".MyService"></service>
<service android:name=".MyIntentService"></service>
MainActivity
public class MainActivity extends Activity implements View.OnClickListener{
private Button mButtonStart;
private Button mButtonStop;
private Button mButtonDownLoad;
private ProgressBar mProgressBar;
private IntentFilter mFilter;
private DownLoadReceiver mReceiver;
public static final String DOWN_LOAD_ACTION="android.receiver";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonStart= (Button) findViewById(R.id.button_start);
mButtonStop= (Button) findViewById(R.id.button_stop);
mButtonDownLoad= (Button) findViewById(R.id.button_download);
mProgressBar= (ProgressBar) findViewById(R.id.progressBar);
mButtonStart.setOnClickListener(this);
mButtonStop.setOnClickListener(this);
mButtonDownLoad.setOnClickListener(this);
mFilter=new IntentFilter();
mFilter.addAction(DOWN_LOAD_ACTION);
mReceiver=new DownLoadReceiver();
registerReceiver(mReceiver,mFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button_start:
Intent intent=new Intent(getApplicationContext(),MyService.class);
startService(intent);
break;
case R.id.button_stop:
Intent intent1=new Intent(getApplicationContext(),MyService.class);
// Intent intent1=new Intent(getApplicationContext(),MyIntentService.class);//启动IntentService
stopService(intent1);
break;
case R.id.button_download:
Intent intent2=new Intent(getApplicationContext(),MyService.class);
// Intent intent2=new Intent(getApplicationContext(),MyIntentService.class);//启动IntentService
startService(intent2);
break;
default:
break;
}
}
class DownLoadReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int count=intent.getIntExtra("count",0);
mProgressBar.setProgress(count);
}
}
}
MyService:(关闭服务后,程序仍在后台运行)
public class MyService extends Service {
private int count=0;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("service", "运行到onStartCommand");
new Thread(new Runnable() {
@Override
public void run() {
while(count<100){
count++;
Intent intent=new Intent();
intent.setAction(MainActivity.DOWN_LOAD_ACTION);
intent.putExtra("count",count);
sendBroadcast(intent);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
Log.d("service", "运行到onCreate");
super.onCreate();
}
@Override
public void onDestroy() {
Log.d("service", "运行到onDestroy");
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
MyIntentService:(关闭程序后,程序退出不再运行)
public class MyIntentService extends IntentService {
int count=0;
public MyIntentService(String name) {
super(name);
}
public MyIntentService(){
this("");
}
@Override
public void onDestroy() {
Log.d("IntentService","运行到onDestroy");
super.onDestroy();
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d("IntentService", "运行到IntentService");
while (true) {
if (count < 100) {
count++;
Intent intent3 = new Intent();
intent3.setAction(MainActivity.DOWN_LOAD_ACTION);
intent3.putExtra("count", count);
sendBroadcast(intent3);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
倒计时
1.使用handler完成线程间通讯:子线程向主线程传递信息
MainActivity(方法一)
public class MainActivity extends Activity {
private Button mButton;
public int count=60;
public static final int COUNT_REDUCE=1;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case COUNT_REDUCE:
String time= (String) msg.obj;
mButton.setText(time);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton= (Button) findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
while(count>0){
count--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Message message=handler.obtainMessage();
Message message=new Message();
message.obj=count+"秒";
message.what=COUNT_REDUCE;
handler.sendMessage(message);
}
}
}).start();
}
});
}
}
MainActivity(方法二:部分代码)
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case COUNT_REDUCE:
count--;
mButton.setText(count+"秒");
if(count>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(COUNT_REDUCE);
}
break;
}
}
};
...
...
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
handler.sendEmptyMessage(COUNT_REDUCE);
}
});
2.子线程接收主线程的消息
MainActivity
public class MainActivity extends Activity {
private Button mButton;
private Button mButton_msg;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton= (Button) findViewById(R.id.button);
mButton_msg= (Button) findViewById(R.id.button_msg);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MyThread thread=new MyThread();
thread.start();
}
});
mButton_msg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
handler.sendEmptyMessage(0);
}
});
}
class MyThread extends Thread{
@Override
public void run() {
Looper.prepare();
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
Log.d("message","接收到消息");
}
};
Looper.loop();
}
}
}
先点击“60秒”按钮,再点击“接收消息”按钮
AsyncTask
MainActivity
public class MainActivity extends Activity {
private Button mButton;
private ProgressBar mProgressBar;
private int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton= (Button) findViewById(R.id.button);
mProgressBar= (ProgressBar) findViewById(R.id.progressBar);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MyTask task=new MyTask();
task.execute("执行");
}
});
}
class MyTask extends AsyncTask<String,String,String>{
@Override
protected String doInBackground(String... strings) {
while(count<101){
count++;
publishProgress(""+count);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "完成";
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
int count=Integer.parseInt(values[0]);
mProgressBar.setProgress(count);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
mButton.setText(s);
}
}
}
开始:
完成: