由于Service常常用于处理比较耗时的后台服务,在不适用多线程时,所有的组件服务都是在主线程中执行的,必然会影响用户体验和整体性能,下面是两种启动Service线程的方式。
第一种方法:在Service服务代码的onstartConmmand启动函数中创建一个继承了Thread的实例对象,并使用start()启动线程
Activity代码:
package com.example.service02;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView.FindListener;
import android.widget.Button;
public class Main extends Activity {
private Button ButtonNormalService;
private Button ButtonIntentService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service02);
ButtonNormalService = (Button)findViewById(R.id.button1);
ButtonIntentService = (Button)findViewById(R.id.button2);
ButtonNormalService.setOnClickListener(listener);
ButtonIntentService.setOnClickListener(listener);
}
private OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View arg0) {
// 第一种方法: 继承Thread类,标准Java的多线程启动方式。
Intent intent = new Intent(Main.this,Serviceapp.class);
switch (arg0.getId()) {
case R.id.button1:
System.out.println("当前线程为:"+Thread.currentThread().getId());
startService(intent);
break;
case R.id.button2:
stopService(intent);
break;
default:
break;
}
}
};
}
Service服务代码:
package com.example.service02;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class Serviceapp extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
// 第一种方法在onstartConmmand启动函数中创建一个继承了Thread的实例对象,并使用start()启动线程
@Override
public int onStartCommand(Intent intent, int flags, int startId) { // 使用一个多线程来处理Service信息 第一种方法
MyThread mythread = new MyThread();
mythread.start();
return super.onStartCommand(intent, flags, startId);
}
private class MyThread extends Thread{ // 在线程的run()中进行处理
@Override
public void run() {
System.out.println("service "+Thread.currentThread().getId());
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
第二种方法:
由于自己复写Thread创建多线程的方法代码量比较大,所以在启动Service服务时,Android提供了IntentService方法去启动多线程。
IntentService是Service类的一个子类,用来处理异步请求,客户端使用IntentService(Intent)方法传递请求给IntentService,IntentService通过work Thread处理每个Intent对象,执行完所有的工作之后,自动停止Service。
Activity代码:
package com.example.service02;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView.FindListener;
import android.widget.Button;
public class Main extends Activity {
private Button ButtonNormalService;
private Button ButtonIntentService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service02);
ButtonNormalService = (Button)findViewById(R.id.button1);
ButtonIntentService = (Button)findViewById(R.id.button2);
ButtonNormalService.setOnClickListener(listener);
ButtonIntentService.setOnClickListener(listener);
}
private OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View arg0) {
// 第二种方法: 第二种方式使用intentService
Intent intent = new Intent(Main.this,ExampleIntentService.class);
switch (arg0.getId()) {
case R.id.button1:
System.out.println("当前线程为:"+Thread.currentThread().getId());
startService(intent);
break;
case R.id.button2:
stopService(intent);
break;
default:
break;
}
}
};
}
使用Intent
使用IntentService需要两个步骤:
1 写构造方法:将继承的子类名传入到IntentService类中。
2 复写onHandleIntent()方法(处理多线程任务)
package com.example.service02;
import android.app.IntentService;
import android.content.Intent;
public class ExampleIntentService extends IntentService {
public ExampleIntentService() {
super("ExampleIntentService");
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intent arg0) {
System.out.println("service 2222 "+Thread.currentThread().getId());
try
{
Thread.sleep(3000);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
<service android:name=".ExampleIntentService"></service>