在我的活动中,有一个我想从服务( 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 中的每个项目,处理一些数据,然后使用新数据更新该特定项目。 / p>
MyObject 类具有很多我需要更新的属性。将 objectList 从 mainActivity 传递给 TestService 的正确方法是什么,以便我可以直接使用对象列表?谢谢!
答案 0 :(得分:1)
通过在Activity
中维护对Service
的引用,会导致内存泄漏,因为当视图由于以下原因而被破坏时,可以防止系统垃圾回收Activity
Activity
贯穿其生命周期。
您应该使用Service
将Activity
到BroadcastReceiver
的更改传达给Activity
,如@NongthonbamTonthoi在评论中所述。基本上,BroadcastReceiver
应该实例化Service
,以监听Service
在执行更新时发送的特定类型的广播(由您定义的唯一密钥标识)。 / p>
此外,我建议您移动列表,以便将其存储在Activity
中,然后使Service
通过绑定从Service
检索列表到IBinder
,然后调用在您的onBind(Intent)
实现中定义的方法(应从Service
返回其实例)。这样,您可以将对模型进行更改的所有代码限制在Activity
范围内,并将Activity
保留为简单呈现模型的(哑)视图。借助此设计,Morover还可以通过开始 Service
(注意:除了 绑定到列表之外),使列表在Activity
之上),这样即使Service
被销毁(例如,由于您的应用程序被置于后台的结果),您也可以保留列表的状态。如果选择此设计,则Activity
发送的广播可以简单地通知列表已更改,然后getList
可以通过调用指定的IBinder
方法来检索更新的列表。在您的php -S 0.0.0.0:8000 -t public/
实现中。