我们在使用BroadcastManager的时候,会分为隐式和显式两种广播。他们各有各的用处,但是在使用隐式广播的时候,会因为其覆盖的面比较大,会因为一些原因被其它应用程序所得到我们的广播内容。LocalBroadcastManager是一个只在本应用内使用的BroadcastManager。它的代码很少只有300多行,想了解细节的朋友可以去看一下源代码。
IntentService是Service的一个子类,可以看做是Service和HandlerThread的结合体,在完成了使命之后会自动停止,适合需要在工作线程处理UI无关任务的场景。
IntentService有以下三个特点:
1、IntentService 是继承自 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作。
2、当任务执行完后,IntentService 会自动停止,不需要我们去手动结束。
3、如果启动 IntentService 多次,那么每一个耗时操作会以工作队列的方式在 IntentService 的 onHandleIntent 回调方法中执行,依次去执行,使用串行的方式,执行完自动结束。
下面我们通过一个例子来看一下,它们的使用
activity_main.xml
package com.cg.intentservcelearn;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import com.cg.intentservcelearn.services.MyIntentService;
import com.cg.intentservcelearn.services.MyService;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_1;
private Button btn_2;
private Button btn_3;
private SeekBar seekbar1;
private SeekBar seekbar2;
private LocalBroadcastManager localBroadcastManager;
private MyBroadcastReceiver mBroadcastReceiver;
public final static String ACTION_TYPE_THREAD = "action.type.thread";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initControls();
//注册广播
localBroadcastManager = LocalBroadcastManager.getInstance(this);
mBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_TYPE_THREAD);
localBroadcastManager.registerReceiver(mBroadcastReceiver,filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
}
/**
* 初始化控件
*/
private void initControls() {
btn_1 = (Button)findViewById(R.id.btn_1);
btn_1.setOnClickListener(this);
btn_2 = (Button)findViewById(R.id.btn_2);
btn_2.setOnClickListener(this);
btn_3 = (Button)findViewById(R.id.btn_3);
btn_3.setOnClickListener(this);
seekbar1 = (SeekBar)findViewById(R.id.seekbar1);
seekbar2 = (SeekBar)findViewById(R.id.seekbar2);
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.btn_1:
Intent intent = new Intent(MainActivity.this, MyService.class);
intent.putExtra("type",1);
startService(intent);
break;
case R.id.btn_2:
Intent intent2 = new Intent(MainActivity.this, MyService.class);
intent2.putExtra("type",2);
startService(intent2);
break;
case R.id.btn_3:
break;
}
}
public class MyBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case ACTION_TYPE_THREAD:
//更改ui
int progress = intent.getIntExtra("progress", 0);
int mType = intent.getIntExtra("type",0);
if(mType==1)
{
seekbar1.setProgress(progress);
}else if(mType==2){
seekbar2.setProgress(progress);
}else{
}
break;
}
}
}
}
MainActivity.java
package com.cg.intentservcelearn;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import com.cg.intentservcelearn.services.MyIntentService;
import com.cg.intentservcelearn.services.MyService;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_1;
private Button btn_2;
private SeekBar seekbar1;
private SeekBar seekbar2;
private LocalBroadcastManager localBroadcastManager;
private MyBroadcastReceiver mBroadcastReceiver;
public final static String ACTION_TYPE_THREAD = "action.type.thread";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initControls();
//注册广播
localBroadcastManager = LocalBroadcastManager.getInstance(this);
mBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_TYPE_THREAD);
localBroadcastManager.registerReceiver(mBroadcastReceiver,filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
}
/**
* 初始化控件
*/
private void initControls() {
btn_1 = (Button)findViewById(R.id.btn_1);
btn_1.setOnClickListener(this);
btn_2 = (Button)findViewById(R.id.btn_2);
btn_2.setOnClickListener(this);
seekbar1 = (SeekBar)findViewById(R.id.seekbar1);
seekbar2 = (SeekBar)findViewById(R.id.seekbar2);
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.btn_1:
Intent intent = new Intent(MainActivity.this, MyService.class);
intent.putExtra("type",1);
startService(intent);
break;
case R.id.btn_2:
Intent intent2 = new Intent(MainActivity.this, MyService.class);
intent2.putExtra("type",2);
startService(intent2);
break;
}
}
public class MyBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case ACTION_TYPE_THREAD:
//更改ui
int progress = intent.getIntExtra("progress", 0);
int mType = intent.getIntExtra("type",0);
if(mType==1)
{
seekbar1.setProgress(progress);
}else if(mType==2){
seekbar2.setProgress(progress);
}else{
}
break;
}
}
}
}
MyIntentService.java
package com.cg.intentservcelearn.services;
import android.app.IntentService;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import com.cg.intentservcelearn.MainActivity;
public class MyIntentService extends IntentService {
/**
* 是否正在运行
*/
private boolean isRunning;
/**
*进度
*/
private int count;
/**
* 广播
*/
private LocalBroadcastManager mLocalBroadcastManager;
public MyIntentService() {
super("MyIntentService");
}
@Override
public void onCreate() {
super.onCreate();
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
}
@Override
protected void onHandleIntent(Intent intent) {
int mType = intent.getIntExtra("type",0);
try {
Thread.sleep(1000);
isRunning = true;
count = 0;
while (isRunning) {
count++;
if (count >= 100) {
isRunning = false;
}
Thread.sleep(50);
sendThreadStatus(count, mType);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 发送进度消息
*/
private void sendThreadStatus(int progress,int type) {
Intent intent = new Intent(MainActivity.ACTION_TYPE_THREAD);
intent.putExtra("progress", progress);
intent.putExtra("type",type);
mLocalBroadcastManager.sendBroadcast(intent);
}
}
在AndroidManifest.xml文件中注册这个servies
好了,运行一下,看一下效果吧。这里我就不加图了。
你点第一个按钮之后,在进度条,没有头的时候,再点第二个,会看到什么。。。。。会看到intentService的一个特性。运行一下看一下吧