MainActivity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
public
class
MainActivity
extends
Activity
{
Mybinder mybinder =
null
;
ServiceConnection mConn =
new
ServiceConnection()
{
@Override
public
void
onServiceDisconnected(ComponentName name)
{
}
@Override
public
void
onServiceConnected(ComponentName name, IBinder binder)
{
mybinder = (Mybinder) binder;
//对象binder,强转为Mybinder类型
Log.e(
"MainActivity"
,
"mybinder.getname()"
);
}
};
@Override
protected
void
onCreate(Bundle savedInstanceState)
{
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final
TextView textView1 = (TextView) findViewById(R.id.textView1);
final
TextView textView2 = (TextView) findViewById(R.id.textView2);
findViewById(R.id.button1).setOnClickListener(
new
OnClickListener()
{
@Override
public
void
onClick(View v)
{
Intent intent =
new
Intent(MainActivity.
this
,MyService.
class
);
bindService(intent, mConn, BIND_AUTO_CREATE);
}
});
findViewById(R.id.button2).setOnClickListener(
new
OnClickListener()
{
@Override
public
void
onClick(View v)
{
unbindService(mConn);
}
});
findViewById(R.id.button3).setOnClickListener(
new
OnClickListener()
{
@Override
public
void
onClick(View v)
{
textView1.setText(mybinder.play());
//通过mybinder调用service的方法,或者通过方法将数据传给service
}
});
findViewById(R.id.button4).setOnClickListener(
new
OnClickListener()
{
@Override
public
void
onClick(View v)
{
textView2.setText(mybinder.pause());
}
});
}
@Override
public
boolean
onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.activity_main, menu);
return
true
;
}
}
|
MyService:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
public
class
MyService
extends
Service
{
public
String play()
{
return
"播放"
;
}
public
String pause()
{
return
"暂停"
;
}
class
Mybinder
extends
Binder
//Binder类继承了接口IBinder,Mybinder继承Binder类
{
//在Mybinder创建方法
public
String getname()
{
return
"myBinder"
;
}
//调用外部方法
public
String play()
{
return
MyService.
this
.play();
}
public
String pause()
{
return
MyService.
this
.pause();
}
}
private
IBinder binder =
new
Mybinder();
//IBinder声明创建一个Mybinder对象
@Override
public
IBinder onBind(Intent intent)
{
Log.e(
"MyService"
,
"onBind"
);
return
binder;
//返回IBinder对象
}
@Override
public
void
onCreate()
{
Log.e(
"MyService"
,
"onBind"
);
super
.onCreate();
}
@Override
public
boolean
onUnbind(Intent intent)
{
Log.e(
"MyService"
,
"onUnbind"
);
return
super
.onUnbind(intent);
}
@Override
public
void
onDestroy()
{
Log.e(
"MyService"
,
"onDestroy"
);
super
.onDestroy();
}
}
|
注:
-
service属性
android:enabled
这个属性用于指示该服务是否能够被实例化。如果设置为true,则能够被实例化,否则不能被实例化。默认值是true。
<application>元素有它自己的enabled属性,它的这个属性适用于应用中所有的组件,包括service组件。对于被启用的服务,<application>和<service>元素的enabled属性都必须是true(默认值都是true)。如果有一个元素的enabled属性被设置为false,该服务就会被禁用,而不能被实例化。
android:exported
这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使用者不会知道该服务的类名),因此这种情况下,这个属性的默认值是false。另一方面,如果至少包含了一个过滤器,则意味着该服务可以给外部的其他应用提供服务,因此默认值是true。
这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体。
本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1198599,如需转载请自行联系原作者