首页 > 解决方案 > 从服务中的活动访问变量的正确方法

问题描述

在我的活动中,我想从服务(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类有很多我需要更新的属性。将objectListmainActivity传递到TestService以便我可以直接使用对象列表的正确方法是什么?谢谢!

标签: androidandroid-activityservice

解决方案


通过维护对 a 的引用ActivityService您会引入内存泄漏,因为您会阻止系统在视图由于其生命周期的进展而Activity被销毁时进行垃圾收集。Activity

相反,您应该按照@NongthonbamTonthoi 在评论中的解释,将 所做的更改传达ServiceActivity使用 a 。BroadcastReceiver基本上Activity应该实例化一个BroadcastReceiver监听特定类型的广播(由您定义的唯一键标识),Service它在执行更新时发送。

此外,我建议您移动列表以便将其存储在 中Service,然后通过绑定到 来Activity检索列表,然后调用实现中定义的方法(应从 中返回其实例)。通过这种方式,您可以将所有对模型进行更改的代码限制在 中,并将其保留为仅呈现模型的(哑)视图。Morover,通过这种设计,您可以通过启动(注意:除了绑定到它)使您的列表比ServiceServiceIBinderonBind(Intent)ServiceActivityActivityServiceActivity被销毁(例如,由于您的应用程序被置于后台)。如果您选择这种设计,则发送的广播 Service可以只是列表已更改的通知,Activity然后可以通过调用您的实现getList中指定的方法来检索更新的列表。IBinder


推荐阅读