Android studio 工程
第一步,创建一个工程,建立一个简单的service
1.我们工程创建完毕,接下来进入到
MainActivity
里面,在当前包下右键创建一个类,继承自Service,具体的操作我们截图了,看截图怎么创建,只是新手操作的,
在创建好的工程基础上进行如下操作
这里两种Service 为什么我们选择第一种
其实这个地方我也了解的不是很深入,
- 第二种我们可以在AndroidMainfest.xml 指定Intent-filter里面的action name 因为系统服务很多,简单来说也就是指定一个匹配名字,知道我们当前需要用哪一个服务,是需要在使用时绑定的,使用bindService
- 第一种的那个我们一般是直接使用startService(intent),启动服务的,这两种具体怎么区分我也不是很清楚,待后面仔细研究一下,我的简单理解就是所管理的生命周期不一样,
接下来我们看下服务类怎么写,这里还有一步,别忘了,就是在配置文件
添加,创建好之后这个要手动添加一下action,来给我们的服务起个名字
<application android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="my.teco.plee.sigalton.MsgService"
android:enabled="true"
android:permission="my.teco.plee.sigalton.MsgService">
<intent-filter> <action
android:name="my.teco.plee.sigalton.MSG_ACTION"></action>
</intent-filter>
</service>
</application>
这里写代码了
public class MsgService extends Service {
/**
* 进度条的最大值
*/
public static final int MAX_PROGRESS_VALUE = 100;
/**
* 进度条的进度值
*/
private int progress = 0;
//下面这句话是第二种方法,用通知
private Intent intent = new Intent("my.teco.plee.sigalton.RECEIVER");
//下面这个是使用第一种方法
/**
* 更新进度的回调接口
*/
private OnProgressListener onProgressListener;
/**
* 注册回调接口的方法,供外部调用
*/
public void setOnProgressListener(OnProgressListener onProgressListener){
//获取传入的接口对象
this.onProgressListener = onProgressListener;
}
/**
* 增加get() 方法,供Activity调用
*
* @return 下载进度
*/
public int getProgress() {
return progress;
}
/**
* 模拟下载任务,每秒钟更新一次
*/
public void startDownLoad() {
new Thread(new Runnable() {
@Override
public void run() {
while (progress < MAX_PROGRESS_VALUE) {
progress += 5;
//发送Action为my.teco.plee.sigalton.RECEIVER
intent.putExtra("progress",progress);
sendBroadcast(intent);//
//进度条发生变化通知方法//
if (onProgressListener !=null){//
onProgressListener.onProgress(progress);//
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();//开启
}
public MsgService() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
startDownLoad();
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
//如果使用第一种方法的话需要下面这样写
// return new MsgBinder();
//第二种方法需要写成下面
return null;
// throw new UnsupportedOperationException("Not yet implemented");
}
//返回绑定服务返回的实例
public class MsgBinder extends Binder{
/**
* 获取当前Service的实例
* @return
*/
public MsgService getService(){
return MsgService.this;
}
}}
MainActivity 我们的代码,第一种方法,
public class MainActivity extends AppCompatActivity {
private MsgService msgService;
private int progress = 0;
private ProgressBar mProgressBar;
private MsgReceiver msgReceiver;
private Intent mIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//
SharePreferenceClass.getInstance().getClass();
//绑定Service 第一种方法 ,如果使用第二种方法注释下面这两句
Intent intent = new Intent("my.teco.plee.sigalton.MSG_ACTION");
bindService(intent,connection, Context.BIND_AUTO_CREATE);
//第二种方法,打开下面的广播接收器
//动态注册广播接收器
// msgReceiver = new MsgReceiver();
// IntentFilter intentFilter = new IntentFilter();
// intentFilter.addAction("my.teco.plee.sigalton.RECEIVER");
// registerReceiver(msgReceiver, intentFilter);
mProgressBar = (ProgressBar) findViewById(R.id.progessBar1);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//下面是第一种方法,每次我们只能使用一个
//开始下载
msgService.startDownLoad();
//监听进度
listenProgress();
//下面是第二种形式启动service,我们先注释掉
//启动服务
// mIntent = new Intent("my.teco.plee.sigalton.MSG_ACTION");
// startService(mIntent);
}
});
}
/**
* 监听进度,每秒获取调用MsgService 的getPress方法来获取进度,更新UI
*/
public void listenProgress() {
new Thread(new Runnable() {
@Override
public void run() {
while (progress < MsgService.MAX_PROGRESS_VALUE) {
progress = msgService.getProgress();
mProgressBar.setProgress(progress);
System.out.println(progress+"我");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
//第一种方法使用下面这个
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder
service) {
//返回一个MsgService对象
msgService = ((MsgService.MsgBinder) service).getService();
//注册回调接口来接受下载进度的变化
//msgService 相当于Class B,Activity 相当于Class a ,
// setOnProgressListener相当于方法C,A调用B类的方法C,C方法的参数中有接口。
// 传入方法C中的接口要实现接口中的方法。
msgService.setOnProgressListener(new
OnProgressListener() {
@Override
public void onProgress(int progress) {
mProgressBar.setProgress(progress);
}
});
System.out.println("我已经连接了");
}
@Override
public void onServiceDisconnected(ComponentName name) {
} };
@Override
protected void onDestroy() {
super.onDestroy();
//停止服务
unbindService(connection);
//注销广播 第二种在写这个,
unregisterReceiver(msgReceiver);
}
// 第二种方法使用下面的
/**
* 广播接受器
*/
public class MsgReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//拿到进度
int progress = intent.getIntExtra("progress",0);
mProgressBar.setProgress(progress);
System.out.println(progress + "我");
}
}}
我们贴上接口代码
public interface OnProgressListener {
void onProgress(int progress);}
}
最后我们看一下工程目录结构
以上是使用service ,进行简单的计数,第一种是使用回调,第二种是使用通知更新