安卓中的特殊服务:IntentService

Service是Android中的四大组件之一,它是在后台运行的,被用来处理比较耗时或长时间运行的操作。现在我们有一个需求:下载一个大的文件。根据Service的特性,我们很容易想到用开启一个Service来进行下载。Service有两种启动方式,startService和bindService,那么问题来了,我们用哪种方式启动呢?方案1:用一个程序组件startService,用该方法启动Service后,Service会一直在后台运行,即使该组件被终止,Service仍然继续运行,但是当文件下载完成,我们不希望Service继续运行,比较消耗资源。方案2:用一个程序组件bindService,用该方法绑定一个Service,如果该组件被终止,Service也会停止运行,我们不希望用户点击完下载就不能进行其他操作。那么该怎么办呢?接下来就是IntentService表现的时候了。IntentService是Service的一个子类,他本质上就是一个Service,它的特点是在完成操作后会自动的停止,并且它会自动开启一个线程。使用的时候我们编写一个类继承IntentService,同时,我们需要在清单文件中注册,如同Service。

public class MyIntentService extends IntentService {

	public MyIntentService() {
		this("MyThread");
	}

	// IntentService会自动建立一个子线程,并在其中执行,name为子线程的名称
	public MyIntentService(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	// 要做的操作写在这个方法中,方法执行结束执行onDestory(),可以通过Intent来接受传递过来的数据
	@Override
	protected void onHandleIntent(Intent intent) {
		String extra = intent.getStringExtra("url");
		System.out.println(extra);
		// 模拟耗时操作,注意不用开启子线程
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("ThreadName:" + Thread.currentThread().getName());
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		System.out.println("onDestory");
	}
}

这样一个IntentService就完成了,接下来开始编写调用他的组件。

public class MainActivity extends ActionBarActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Button bt = (Button) findViewById(R.id.bt);
		bt.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(getApplicationContext(), MyIntentService.class);
				// 传递的数据
				intent.putExtra("url", "http://www.baidu.com");
				startService(intent);
			}
		});
	}
}
我们在Activity里面添加了一个Button,点击这个Button之后开启一个IntentService,并通过Intent传递数据。可以看出IntentService使用起来还是很简单的。

你可能感兴趣的:(Android学习)