1.用startService启动
activity向service传递参数(包括创建Servicee)
Service类
//1.新建一个类继承Service,记得在清单文件中注册
//<service android:name=".Service1"></service>
public class Service1 extends Service{
//2.重写onCreate(),onCreate()只会执行一次
@Override
public void onCreate() {
super.onCreate();
Log.e("onCreate","onCreate");
}
//3.重写onBind()方法,该方法必须要重写
@Override
public IBinder onBind(Intent intent) {
return null;
}
//4.重写onStartCommand()方法,该方法会执行多次,所以主要的业务逻辑写在这个方法里
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//5.如果要进行耗时操作,需要再开一个子线程,不然会有...much to work...
new Thread(){
@Override
public void run() {
super.run();
for(int i =1;i <=10;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.e("onStartCommand","onStartCommand");
}
}
}.start();
//7.通过这个put这个key,找到后面的value,内容
String s = intent.getStringExtra("put");
Toast.makeText(getApplicationContext(),s,Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent, flags, startId);
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
Button btnstart,btndestory;
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnstart = findViewById(R.id.btnstart);
intent = new Intent(MainActivity.this, Service1.class);
btnstart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//6.activity向service传递参数,类似于activity跳转页面携带参数
intent.putExtra("put","服务已开启");
startService(intent);
}
});
findViewById(R.id.btndestory).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//停止服务
stopService(intent);
}
});
}
}
activity_main
只有两个简单的Button
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btnstart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击启动"/>
<Button
android:id="@+id/btndestory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击销毁"/>
</LinearLayout>
2.用bindService启动
Service
和之前类似,记得记得在清单文件中注册
public class ServiceD extends Service{
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.e("hahaha","onCreate");
}
@Override
public void unbindService(ServiceConnection conn) {
super.unbindService(conn);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("hahaha","onDestroy");
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
Mycon mycon;
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mycon = new Mycon();
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
intent = new Intent(MainActivity.this, ServiceD.class);
//第一个参数为intent,直接new一个
//第二个参数为ServiceConnection,是一个接口
//第三个参数一般写BIND_AUTO_CREATE,自动创建绑定
bindService(intent,mycon, BIND_AUTO_CREATE);
}
});
findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//解绑的参数只有一个,就是ServiceConnection接口
unbindService(mycon);
}
});
}
//自己写一个类Mycon,实现ServiceConnection接口,重写两个方法
//功能为监听服务的状态
public class Mycon implements ServiceConnection{
//当连接成功时
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
//当连接断开时
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
3.小案例,在MainActivity中调用Service中的方法
Service
public class MyService extends Service {
//1.重写onBind方法,返回一个IBind
@Override
public IBinder onBind(Intent intent) {
//4.实例化
MyBind myBind = new MyBind();
return myBind;
}
private void banzheng(int money){
if (money>5000){
Toast.makeText(getApplicationContext(),"办证成功",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getApplicationContext(),"办证失败",Toast.LENGTH_SHORT).show();
}
}
//2.中间商Mybind继承Binder,(Binder继承IBinder)
public class MyBind extends Binder {
//3.callzheng这个方法调用banzheng
public void callzheng(int money){
banzheng(money);
}
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
//5.声明这个类
private MyService.MyBind newBind;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this,MyService.class);
bindService(intent,new Mycon(),BIND_AUTO_CREATE);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//7.调用callzheng方法
newBind.callzheng(200);
}
});
}
private class Mycon implements ServiceConnection{
//连接成功时
@Override
public void onServiceConnected(ComponentName name, IBinder iBinder) {
//6.实例化
newBind = (MyService.MyBind) iBinder;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}