service初级:Activity与service间的联系、重写ServiceConnection

本文详细介绍了Android中通过ServiceConnection实现服务绑定的过程,并展示了如何在MainActivity与MyService之间进行通信,包括方法调用和服务状态管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



  1. 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,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值