FVo*_*Vod 10 singleton android design-patterns android-service android-lifecycle
创建Service一个单独的工具是不好的做法?我的意思是一个Service永远不会停止,并包含一些其他引擎和Activities将使用的私人数据,所以Service可能有类似的东西:
public class CustomService extends Service {
private List<Profile> mProfiles;
private static CustomService instance;
public static CustomService getInstance() {
if(instance == null) {
instance = new CustomService();
}
return instance;
}
public List<Profile> getProfiles() {
return mProfiles;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
做一个Service而不仅仅是一个单例的原因是它必须独立于应用程序工作,因为它在启动时连接一个永远不应该关闭且不依赖于应用程序的websocket.你建议我做什么?有没有更好的方法来重新使用Service,以便mProfiles从其他引擎获得一些数据(例如数组)Activities?
我读过Service一个单独的工作,但我不知道如何从应用程序的任何其他点访问私有变量.
Oni*_*nik 13
创建一个单独的服务是不好的做法?
它是多余的,并且,就你所建议的方式而言,从Android Service作为应用程序组件的角度来看,它不会起作用.
Application 生命周期,反过来,受到影响通过以下方式达到应用程序组件的这种意图
AndroidManifest.xml,Application并将其"附加"到ApplicationThread/ ActivityThread.也就是说,应用程序组件与ApplicationOS进程托管的实例绑定,无法独立运行.
关于您的方法,有两种情况:
1. 根据模式,CustomService默认构造函数是私有的.
通过调用getInstance()单个实例CustomService创建.该实例只是一个Java与Android Service应用程序组件没有任何共同点的对象(单例).的onStart(),onStartCommand()等方法将永远不会被系统调用.
尝试启动"服务"(在清单中声明)startService(Intent)将失败IllegalAccessException: access to constructor not allowed.
2. CustomService默认构造函数是public(根据发布的代码).
如果声明了服务AndroidManifest并且默认构造函数为空,startService()则不会失败,但是getInstance()会创建另一个CustomService不会被视为Android Service应用程序组件的实例.
这不是单身人士.
你建议我做什么?是否有更好的方法来重用服务,以便从其他引擎和活动中获得一些数据(例如mProfiles数组)?
使用Service按文件,并选择您需要的类型的通信:
Activity --> Service) - 使用一个启动Service并处理每个Intent(与你的数据相连,就像mProfiles在Profile类实现的情况下Parcelable)onStartCommand();Activity <-> Service) - 使用绑定Service和通信通道IBinder.最后,Servicein Android是一个单身人士.系统中每个服务只有一个实例.它按需启动并处理所有挂起的Intents/bound客户端.一旦完成或明确停止,它将被销毁.