欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > Android Service服务使用方法

Android Service服务使用方法

2024/10/24 19:16:28 来源:https://blog.csdn.net/wenwang88/article/details/142066545  浏览:    关键词:Android Service服务使用方法

启动服务的方法

我们要隐式启动一个Service,首先我们需要配置AndroidMainfest.xml

        <service android:name=".MyAsdlService"><intent-filter><action android:name="com.example.myasdlservice" /></intent-filter></service>

然后在Activity中启动service

    @Overridepublic void onClick(View view) {Intent intent = new Intent();intent.setAction("com.example.myasdlservice");startService(intent);}

跨应用启动服务

Intent intent = new Intent();  
intent.setAction("ccom.example.myasdlservice");  
//两种方式设置
//第一种,直接设置包名
intent.setPackage("这里输入包名");  //第二种
ComponentName mComponentName = new ComponentName("包名", "类名");
intent.setComponent(mComponentName);//启动Service
startService(intent);  
// context.startServiceAsUser(startIntent, UserHandle.SYSTEM);
//context.startServiceAsUser(startIntent, UserHandle.CURRENT);

具体例子如下:

    Intent startIntent = new Intent("com.xxx.action.myService");ComponentName mComponentName = new ComponentName("com.xxx.myApp", "com.xxx.myApp.myService");startIntent.setComponent(mComponentName);context.startServiceAsUser(startIntent,	UserHandle.CURRENT);//context.bindServiceAsUser(startIntent, mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.CURRENT);private class myServiceConnection implements ServiceConnection {public void onServiceConnected(ComponentName componentName, IBinder service) {}public void onServiceDisconnected(ComponentName componentName) {}}    

 

android启动服务失败

提示:Unable to start service Intent { cmp=xxx/.xxx} U=0: not found

最终发现清单文件里application配置了directBootAware属性,意思是允许程序在系统未启动完成时启动(解锁阶段),但是TestService却没有相关配置。因此当程序启动时服务是找不到的,通过配置以下属性解决问题:

    <applicationandroid:name=".MyApplication"android:directBootAware="true"android:supportsRtl="true"><service android:name=".TestService"android:directBootAware="true"android:enabled="true"/>
  • android:directBootAware:是否允许系统解锁设备之前运行服务,默认false
  • android:enabled:系统是否可实例化service,默认true

另外出现的一个异常:

java.lang.IllegalStateException: SharedPreferences in credential encrypted storage are not available until after user is unlocked

这个错误会导致程序崩溃,原因设备未解锁前不可读取SharedPreferences数据。在配置了directBootAware属性后,在程序启动的时候、系统没准备好前去操作sp就会出现这个异常。

<applicationandroid:defaultToDeviceProtectedStorage="true"。。。。。/>

 

     Intent startIntent = new Intent("com.xxx.action.myService");
    ComponentName mComponentName = new ComponentName("com.xxx.myApp", "com.xxx.myApp.myService");
    startIntent.setComponent(mComponentName);
    context.startServiceAsUser(startIntent,    UserHandle.CURRENT);
    //context.bindServiceAsUser(startIntent, mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.CURRENT);
    private class myServiceConnection implements ServiceConnection {
        public void onServiceConnected(ComponentName componentName, IBinder service) {
        }
        public void onServiceDisconnected(ComponentName componentName) {
        }
    }    

    Intent startIntent = new Intent("com.xxx.action.myService");
    ComponentName mComponentName = new ComponentName("com.xxx.myApp", "com.xxx.myApp.myService");
    startIntent.setComponent(mComponentName);
    context.startServiceAsUser(startIntent,    UserHandle.CURRENT);
    //context.bindServiceAsUser(startIntent, mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.CURRENT);
    private class myServiceConnection implements ServiceConnection {
        public void onServiceConnected(ComponentName componentName, IBinder service) {
        }
        public void onServiceDisconnected(ComponentName componentName) {
        }
    }    

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com