从已经 运行 的粘性服务向 activity 发送数据
Send data to activity from already running sticky service
我创建了粘性后台服务,应该在启动时启动:
public class AutostartReceiver extends BroadcastReceiver
{
public AutostartReceiver()
{
}
@Override
public void onReceive(Context context, Intent intent)
{
context.startService(new Intent(context, MyService.class));
}
}
我的服务打算在后台做一些工作,它是通过为此创建线程来实现的。还有 Messenger class 用于将工作状态发送到我的主 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;
}
Main activity 接收从后台线程 运行ning 在我的服务中发送的消息(一些命令,该服务定期发送:
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 将无法再从服务中获取任何消息。
如果我在服务已经 运行ning 时调用启动服务,它将简单地再次 运行 OnStartCommand
,因此将创建新线程(我不想要它) 或者我需要再次销毁 运行ning 线程和 运行 线程。
有什么方法可以让我的 activity 从服务中接收消息,而无需实际接触其中已经 运行ning 线程?我知道绑定服务,但我不清楚如何在我的特定情况下使用它们。
作为替代方式您可以使用 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");
}
};
我会使用广播接收器进行Service
到Activity
的通信。
代码:
public class MyActivity extends Activity {
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//Toast here
}
@Override
protected void onCreate(Bundle savedInstanceState) {
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, new IntentFilter("message-name"));
}
@Override
public void onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);
super.onDestroy();
}
}
然后在您的服务中您将像这样广播消息:
Intent intent = new Intent("message-name");
intent.putExtra("data", 1);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
我创建了粘性后台服务,应该在启动时启动:
public class AutostartReceiver extends BroadcastReceiver
{
public AutostartReceiver()
{
}
@Override
public void onReceive(Context context, Intent intent)
{
context.startService(new Intent(context, MyService.class));
}
}
我的服务打算在后台做一些工作,它是通过为此创建线程来实现的。还有 Messenger class 用于将工作状态发送到我的主 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;
}
Main activity 接收从后台线程 运行ning 在我的服务中发送的消息(一些命令,该服务定期发送:
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 将无法再从服务中获取任何消息。
如果我在服务已经 运行ning 时调用启动服务,它将简单地再次 运行 OnStartCommand
,因此将创建新线程(我不想要它) 或者我需要再次销毁 运行ning 线程和 运行 线程。
有什么方法可以让我的 activity 从服务中接收消息,而无需实际接触其中已经 运行ning 线程?我知道绑定服务,但我不清楚如何在我的特定情况下使用它们。
作为替代方式您可以使用 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");
}
};
我会使用广播接收器进行Service
到Activity
的通信。
代码:
public class MyActivity extends Activity {
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//Toast here
}
@Override
protected void onCreate(Bundle savedInstanceState) {
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, new IntentFilter("message-name"));
}
@Override
public void onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);
super.onDestroy();
}
}
然后在您的服务中您将像这样广播消息:
Intent intent = new Intent("message-name");
intent.putExtra("data", 1);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);