您的位置:首页 > 移动开发 > Android开发

[学习笔记]认识Android Service

2017-05-17 20:53 274 查看
以下内容纯粹为本人学习笔记【记录】之用,所听课程(Q群群友百度网盘提供)为极客学院一位老师所讲(老师大名我尚未知晓),如有侵权请告知。在此特别感谢这位老师录制的视频资料。

1、使用Service



MainActivity.java

public class MainActivity extends AppCompatActivity {

private Intent intent;//定义成员变量

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(MainActivity.this, MyService.class);//初始化Intent

findViewById(R.id.btnStartService).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//启动服务;方式与启动Activity类同
startService(intent);
}
});

findViewById(R.id.btnStopService).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//停止服务;方式也与启动Activity类同
stopService(new Intent(intent));
}
});
}
}


MyService.java

public class MyService extends Service {
public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public
4000
int onStartCommand(Intent intent, int flags, int startId) {
//创建一个线程,不断地运行。以下可用来在后端执行一些必要的代码
new Thread(){
@Override
public void run() {
super.run();
System.out.println("服务在运行...");

//休眠1秒
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
//外界执行了StartService后,会执行此
return super.onStartCommand(intent, flags, startId);
}
}


activity_main.xml

<Button
android:text="启动服务"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnStartService" />

<Button
android:text="停止服务"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnStopService" />


2.绑定服务

相同的代码用封装的方法

绑定服务的方法是bindService();解除绑定服务的方法是unbindService();

修改上述代码:

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {

private Intent intent;//定义成员变量

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(MainActivity.this, MyService.class);//初始化Intent

//启动服务
findViewById(R.id.btnStartService).setOnClickListener(this);
//停止服务
findViewById(R.id.btnStopService).setOnClickListener(this);
//绑定服务
findViewById(R.id.btnBindService).setOnClickListener(this);
//解除绑定服务
findViewById(R.id.btnUnBindService).setOnClickListener(this);
}

@Override
public void onClick(View view) {
//方式也与启动Activity类同
switch (view.getId()) {
case R.id.btnStartService:
startService(intent);
break;
case R.id.btnStopService:
stopService(intent);
break;
case R.id.btnBindService:
bindService(intent, this, Context.BIND_AUTO_CREATE);
break;
case R.id.btnUnBindService:
unbindService(this);
break;

}
}
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//服务绑定成功之后执行
System.out.println("Service Connected success");
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
//所在服务进程崩溃或杀掉之后执行
}
}


MyService.java

public class MyService extends Service {
public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//创建一个线程,不断地运行。以下可用来在后端执行一些必要的代码
new Thread(){
@Override
public void run() {
super.run();
System.out.println("服务在运行...");

//休眠1秒
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
//外界执行了StartService后,会执行此
return super.onStartCommand(intent, flags, startId);
}
}


activity.xml添加两个按钮用于绑定服务和解除绑定服务

<Button
android:text="绑定服务"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnBindService" />

<Button
android:text="解除服务"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnUnBindService" />




3.Service生命周期

创建onCreate(),若想在Create里执行一段程序,可在此办法内添加代码

销毁onDestroy()

在MyService.java重载onCreate()和onDestroy(),观察Service生命周期

//Service生命周期:创建和销毁
@Override
public void onCreate() {
super.onCreate();
System.out.println("Service Create");
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("Service Destroy");
}


若同时启动和绑定了服务,那么必须同时停止服务和解除绑定服务,服务才会停止掉。

启动服务–Back–回到程序,Service仍在运行着–停止服务,此时Service停掉,即Destroy–绑定服务,Service将处于运行状态– Back,将抛出异常,Service同时Destroy;这意味着Activity若和某个Service绑定的话,在退出Activity时,Service将解除绑定。

在onStartCommand()方法下添加打印语句,以“监听”,发现多次点击启动服务,onCreate()只会执行一次,而onStartCommand()会与点击次数执行相同次数。你在外界,只要你执行startService(),在内部就会执行onStartCommand();而在第一次执行startService()时,会执行onCreate(),以后只会执行onStartCommand(),不会重复执行onCreate()

System.out.println("onStartCommand");




如何来控制程序开始和停止?

再写一个成员函数

private boolean serviceRunning = false;//默认情况下是非运行状态


循环将在serviceRunning下执行:false,循环调出,线程结束。

@Override
public void onCreate() {
super.onCreate();
System.out.println("Service Create");
serviceRunning = true;

//创建一个线程,不断地运行。以下可用来在后端执行一些必要的代码
new Thread(){
@Override
public void run() {
super.run();
while (serviceRunning) {
System.out.println("服务在运行...");

//休眠1秒
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}


修改后的MyService.java全部代码如下

public class MyService extends Service {
private boolean serviceRunning = false;//默认情况下是非运行状态
public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("onStartCommand");
//外界执行了StartService后,会执行此
return super.onStartCommand(intent, flags, startId);

}

//Service生命周期:创建和销毁
@Override public void onCreate() { super.onCreate(); System.out.println("Service Create"); serviceRunning = true; //创建一个线程,不断地运行。以下可用来在后端执行一些必要的代码 new Thread(){ @Override public void run() { super.run(); while (serviceRunning) { System.out.println("服务在运行..."); //休眠1秒 try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); }
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("Service Destroy");
serviceRunning = false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: