从服务中的活动访问变量的正确方法

时间:2018-08-02 21:25:10

标签: android android-activity service

在我的活动中,有一个我想从服务( 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 的正确方法是什么,以便我可以直接使用对象列表?谢谢!

1 个答案:

答案 0 :(得分:1)

通过在Activity中维护对Service的引用,会导致内存泄漏,因为当视图由于以下原因而被破坏时,可以防止系统垃圾回收Activity Activity贯穿其生命周期。

您应该使用ServiceActivityBroadcastReceiver的更改传达给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/ 实现中。