Android Studio的四大组件,Android 四大组件之一Service简单的用法以及Broadcast使用

Android studio 工程

第一步,创建一个工程,建立一个简单的service

1.我们工程创建完毕,接下来进入到MainActivity里面,在当前包下右键创建一个类,继承自Service,具体的操作我们截图了,看截图怎么创建,只是新手操作的,

在创建好的工程基础上进行如下操作

242ae46ec18f

右键包名

242ae46ec18f

242ae46ec18f

我们创建一个自定义action的service

这里两种Service 为什么我们选择第一种其实这个地方我也了解的不是很深入,

第二种我们可以在AndroidMainfest.xml 指定Intent-filter里面的action name 因为系统服务很多,简单来说也就是指定一个匹配名字,知道我们当前需要用哪一个服务,是需要在使用时绑定的,使用bindService

第一种的那个我们一般是直接使用startService(intent),启动服务的,这两种具体怎么区分我也不是很清楚,待后面仔细研究一下,我的简单理解就是所管理的生命周期不一样,

242ae46ec18f

自己定义使用的服务类

接下来我们看下服务类怎么写,这里还有一步,别忘了,就是在配置文件

添加,创建好之后这个要手动添加一下action,来给我们的服务起个名字

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme">

android:label="@string/app_name">

android:name="android.intent.category.LAUNCHER" />

android:name="my.teco.plee.sigalton.MsgService"

android:enabled="true"

android:permission="my.teco.plee.sigalton.MsgService">

android:name="my.teco.plee.sigalton.MSG_ACTION">

这里写代码了

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);}

}

最后我们看一下工程目录结构

242ae46ec18f

看图上代码结构进行配置工程

以上是使用service ,进行简单的计数,第一种是使用回调,第二种是使用通知更新

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值