android的Service学习三

   今天学习了android的Service的实例分析,前面讲到了Service是运行在主线程里面的,通过一个实例来证明这一点。项目目录如下:


为了实现Service运行在主线程里面,创建了一个Activity和一个Service。

IntentActivity代码如下:

package com.cooguo.intentService;
import com.cooguo.service.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class IntentActivity extends Activity {
protected static final String TAG = "IntentActivity";
private Button  btnStartNomal = null;
private Button  btnStartIntent = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.intent);
btnStartNomal = (Button)findViewById(R.id.StartNomalService);
btnStartIntent = (Button)findViewById(R.id.StartNomalService);
btnStartNomal.setOnClickListener(listener);
btnStartIntent.setOnClickListener(listener);
}
        
private OnClickListener listener = new OnClickListener(){
@Override
public void onClick(View view) {
Intent intent ;
Button btn = (Button)view;
switch (btn.getId()) {
case R.id.StartNomalService:
intent = new Intent(IntentActivity.this, MyService.class);
Log.i(TAG,"主线程ID "+Thread.currentThread().getId());
startService(intent);
break;
case R.id.StartIntentService:

break;
}
}
};
}

MyService代码也贴在下面:

package com.cooguo.intentService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
protected static final String TAG = "IntentActivity";
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG,"MyService 线程ID"+Thread.currentThread().getId());
return START_STICKY;
}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}

像这样的Service如果遇到要比较浪费时间的操作比如文件上传下载等,就可以用到线程来实现,把MyService代码修改一下:

package com.cooguo.intentService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
protected static final String TAG = "IntentActivity";
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

new MyThread().start();
return START_STICKY;
}

private class MyThread extends Thread{
@Override
public void run() {
try {
Thread.sleep(10000);
Log.i(TAG,"MyService 线程ID"+Thread.currentThread().getId());
Log.i(TAG, "文件下载....");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
         
}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}

还有另外一种方法就是它自身提供了一个Service是IntentService用来处理异步请求。客户端通过startService(Intent intent)方法传递请求给IntentService,IntentService通过work Thread 处理每一个Intent对象,执行完所有的Service自动停止Service。实现IntentService必须要是写构造方法和复写onHandleIntent()方法。现在用一个例子来讲解一下修改IntentActivity类添加一个按钮的时间如下:

private OnClickListener listener = new OnClickListener(){


@Override
public void onClick(View view) {
Intent intent ;
Button btn = (Button)view;
switch (btn.getId()) {
case R.id.StartNomalService:
intent = new Intent(IntentActivity.this, MyService.class);
Log.i(TAG,"主线程ID "+Thread.currentThread().getId());
startService(intent);
break;


case R.id.StartIntentService:
intent = new Intent(IntentActivity.this,ExampleIntentService.class);
Log.i(TAG,"主线程ID"+Thread.currentThread().getId() );
startService(intent);
break;
}
}

};

在IntentService下面创建多一个Service名字为ExampleIntentService.java代码如下:

package com.cooguo.intentService;
import android.app.IntentService;
import android.content.Intent;

import android.util.Log;


public class ExampleIntentService extends IntentService {
protected static final String TAG = "IntentActivity";
public ExampleIntentService() {
super("ExampleIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
try {
Log.i(TAG,"MyService 线程ID"+Thread.currentThread().getId());
Log.i(TAG, "文件下载....");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

点击多几下Start IntentService按钮运行如下图:


有图我们来了解一下IntentService是如何操作的,一开始是创建一个与主线程分开work thread用来处理所有通过Intent传递过来的Intent请求。

创建一个work  queue 一次只传递一个Intent到onHandleIntent()方法中,从而不用担心多线程带来的问题。

 当请求完所有服务自动停止服务,而不用我们自己调用stopSelf()方法。

默认实现了onBind()方法,返回值为null。

默认实现onStartCommand()方法,这个方法将会把我们的Intent放在work queue中,然后在onHandleIntent()方法中执行。

文档中也有提到,我们可以参考文档。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值