gpt4 book ai didi

java - 从已运行的粘性服务将数据发送到 Activity

转载 作者:行者123 更新时间:2023-12-01 18:14:19 24 4
gpt4 key购买 nike

我创建了粘性后台服务,应该在启动时启动:

public class AutostartReceiver extends BroadcastReceiver
{
public AutostartReceiver()
{
}

@Override
public void onReceive(Context context, Intent intent)
{
context.startService(new Intent(context, MyService.class));
}
}

我的服务旨在在后台执行一些工作,它是通过为此创建线程来实现的。还有 Messenger 类用于将工作状态发送到我的主要 Activity :

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
Log.i(TAG, "Service onStartCommand " + startId);

final int currentId = startId;

Messenger callback = null;
if(intent!=null)
{
callback = intent.getParcelableExtra("messenger");
}


final Messenger finalCallback = callback;
Runnable r = new Runnable()
{
public void run()
{
... do something, then stop

stopSelf();
}
};




if(t == null)
{
t = new Thread(r);
t.start();
}


return Service.START_STICKY;
}

主要 Activity 接收从我的服务内运行的后台线程发送的消息(该服务定期发送一些命令:

Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case 0:
Toast.makeText(MainActivity.this,"Service runing", Toast.LENGTH_LONG).show();
break;
}
}
};

仅当我使用 Activity 上下文从 Activity 启动服务时,这才有效。显然,如果服务在启动时启动,或者我的应用程序被关闭(从最后一个应用程序列表中删除)并再次打开,我的 Activity 将无法再从服务获取任何消息。

如果我在服务已经运行时调用启动服务,它将再次运行OnStartCommand,因此要么会创建新线程(我不想要它),要么我需要销毁正在运行的线程并再次运行线程。

有什么方法可以让我的 Activity 从服务接收消息,而不实际接触其中已经运行的线程?我了解绑定(bind)服务,但我不清楚如何在我的具体情况下使用它们。

最佳答案

作为替代方式,您可以使用 LocalBroadcastManager将数据从 Service 发送到 Activity

从服务广播您的消息:

private void broadcastMessage(Context context){
Intent intent = new Intent("UI_UPDATE_BROADCAST");
intent.putExtra("MESSAGE", "MyMessage");
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}

在您的 Activity 中注册广播接收器以接收消息:

@Override
public void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(mContext).registerReceiver(mMessageReceiver, new IntentFilter("UI_UPDATE_BROADCAST"));
}


@Override
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(mContext).unregisterReceiver(mMessageReceiver);
}

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//Do Something With Received Data
String msg = intent.getStringExtra("MESSAGE");
}
};

关于java - 从已运行的粘性服务将数据发送到 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30593330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com