android - 从服务中的活动访问变量的正确方法
问题描述
在我的活动中,我想从服务(TestService )访问一个变量( objectList):
public class MainActivity extends AppCompatActivity
{
List<MyObject> objectList;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService( new Intent( getBaseContext(), TestService.class )
);
}
我有一个服务的骨架:
public class TestService extends Service
{
@Override
public IBinder onBind(Intent intent)
{
return null;
}
@Override
public void onCreate()
{
super.onCreate();
}
@Override
public int onStartCommand( Intent intent, int flags, int startId )
{
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy()
{
super.onDestroy();
}
}
我的目标是每隔 x 秒从TestService循环遍历objectList中的每个项目,处理一些数据,然后用新数据更新这个特定项目。
MyObject类有很多我需要更新的属性。将objectList从mainActivity传递到TestService以便我可以直接使用对象列表的正确方法是什么?谢谢!
解决方案
通过维护对 a 的引用Activity
,Service
您会引入内存泄漏,因为您会阻止系统在视图由于其生命周期的进展而Activity
被销毁时进行垃圾收集。Activity
相反,您应该按照@NongthonbamTonthoi 在评论中的解释,将 所做的更改传达Service
给Activity
使用 a 。BroadcastReceiver
基本上Activity
应该实例化一个BroadcastReceiver
监听特定类型的广播(由您定义的唯一键标识),Service
它在执行更新时发送。
此外,我建议您移动列表以便将其存储在 中Service
,然后通过绑定到 来Activity
检索列表,然后调用实现中定义的方法(应从 中返回其实例)。通过这种方式,您可以将所有对模型进行更改的代码限制在 中,并将其保留为仅呈现模型的(哑)视图。Morover,通过这种设计,您可以通过启动(注意:除了绑定到它)使您的列表比Service
Service
IBinder
onBind(Intent)
Service
Activity
Activity
Service
Activity
被销毁(例如,由于您的应用程序被置于后台)。如果您选择这种设计,则发送的广播 Service
可以只是列表已更改的通知,Activity
然后可以通过调用您的实现getList
中指定的方法来检索更新的列表。IBinder
推荐阅读
- cygwin - Linaro gcc 在 Windows 上失败
- swift - iOS 12 应用程序在 iPhone X/XS 上的横向模式下使用 UIImagePickerController 崩溃
- angular - 异步管道到 src 图像属性 - Angular 2+
- nativescript - 在 RadListView 中禁用按需加载视图
- java - 如何使用 CriteriaBuilder 调用 db 函数
- java - 如何在不重复使用弹簧靴的情况下将两个日期参数用于两个不同的日期?
- c# - 从函数参数设置动作为空
- scala - PySpark 中的状态聚合函数
- sql-server - 回滚时重新启动 SQL Server
- javascript - 来自 Promise React Native 的结果