Activity 如何获取到各种服务service

本文详细解析了Android中Activity如何通过ContextImpl获取系统服务的过程,包括SystemServiceRegistry的作用及内部实现原理,介绍了享元模式在此机制中的应用。

1、每个activity都是ContextImpl(从源码创建一个activity的代码中可以看出)

2、每个activity可以getSystemService(String name)其实调用的是ContextImpl中的方法:getSystemService(String name)

3、ContextImpl中又调用了SystemServiceRegistry.getSystemService(ContextImpl ctx,String name)

4、SystemServiceRegistry是一个系统服务注册类,用private static final HashMap<String, ServiceFetcher<?>> SYSTEM_SERVICE_FETCHERS =new HashMap<String, ServiceFetcher<?>>();保存了用户能使用的服务。

5、系统为服务进行了一个享元模式构建,将服务都用静态模块保存起来。并且利用ServiceFetcher进行了统一处理和封装。

6、这里不方便贴代码,故口述讲解主要过程。如下

static {
        registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class,
                new CachedServiceFetcher<AccessibilityManager>() {
            @Override
            public AccessibilityManager createService(ContextImpl ctx) {
                return AccessibilityManager.getInstance(ctx);
            }});
<span style="white-space:pre">	</span>........

7、这里CachedServiceFetcher实现了ServiceFetcher这个接口。实现了createService方法,此方法返回了我们各种系统服务的管理者XXXManager,此Manager负责与各种服务通信。还实现了getService(),将这里创建的manager 返回出去。

8、静态代码块中的registerService方法,就是将生成的CachedServiceFetcher对象保存在我们前面提到的SYSTEM_SERVICE_FETCHERS 中

9、在3步中,调用SystemServiceRegistry.getSystemService()方法,就是调用SYSTEM_SERVICE_FETCHERS 返回对应name的ServiceFetcher,并调用CachedServiceFetcher中的getService()方法返回对应的manager。


Service获取Activity可通过以下常见方法: - **使用绑定Service**:Activity绑定Service后,可在Service中持有Activity的引用。Activity通过`bindService`方法绑定Service,在`ServiceConnection`的`onServiceConnected`方法中获取`IBinder`对象,进而获取Service引用;在Service中,可在`onBind`方法返回的`IBinder`实现类里提供方法,让Activity将自身引用传递给Service。示代码如下: ```java // 在Service中定义一个接口 public class MyService extends Service { private MyBinder myBinder = new MyBinder(); private Activity mActivity; public class MyBinder extends Binder { public void setActivity(Activity activity) { mActivity = activity; } } @Nullable @Override public IBinder onBind(Intent intent) { return myBinder; } } // 在Activity中绑定Service并传递自身引用 public class MainActivity extends AppCompatActivity { private MyService.MyBinder myBinder; private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { myBinder = (MyService.MyBinder) service; myBinder.setActivity(MainActivity.this); } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(this, MyService.class); bindService(intent, serviceConnection, BIND_AUTO_CREATE); } } ``` - **使用广播**:ActivityService发送广播时,可在广播的`Intent`中携带Activity相关信息,Service通过`BroadcastReceiver`接收广播并获取这些信息。示代码如下: ```java // 在Activity中发送广播 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent("com.example.MY_BROADCAST"); intent.putExtra("activity_info", "MainActivity"); sendBroadcast(intent); } } // 在Service中接收广播 public class MyService extends Service { private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if ("com.example.MY_BROADCAST".equals(intent.getAction())) { String activityInfo = intent.getStringExtra("activity_info"); } } }; @Override public void onCreate() { super.onCreate(); IntentFilter intentFilter = new IntentFilter("com.example.MY_BROADCAST"); registerReceiver(broadcastReceiver, intentFilter); } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(broadcastReceiver); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值