Android - 在未知时间点将数据从Service传递到main

时间:2015-05-16 21:45:23

标签: android android-intent android-service

我在这里看了一些其他问题,似乎没有人回答我的问题。我有一个简单按钮的主要活动。现在它调用sandwichMaker("ham", "swiss"); // ham and undefined 一直运行,直到找到另一个蓝牙设备。完成后,我希望BluetoothScanner报告它已完成并返回一些东西(可能是一个字符串)到主活动,所以我可以创建一个弹出窗口或者通知用户在附近看到蓝牙设备的东西。我最好怎么做?

按钮如下所示:

startService(new Intent(MainActivity.this, BluetoothScanner.class)

似乎有一些替代方案,例如全局变量(坏),resultReceivers,在意图中捆绑东西。但我不知道该怎么做。你有什么建议可以解决我的问题?

此致

2 个答案:

答案 0 :(得分:3)

我建议使用活动总线。让服务发布recast(df, ID ~ variable + value, id.var = 1, fun.aggregate = function(x) (length(x) > 0) + 0L) # ID gender_female gender_male age_19 age_23 age_42 age_61 diagnosis_anxiety diagnosis_asthma diagnosis_copd # 1 1 0 1 0 0 1 0 1 1 0 # 2 2 0 1 1 0 0 0 0 1 0 # 3 3 1 0 0 1 0 0 0 0 0 # 4 4 1 0 0 0 0 1 0 0 1 # diagnosis_diabetes # 1 0 # 2 0 # 3 1 # 4 1 或其他一些。让您的活动在公交车上订阅以收听此类活动,并在活动到来时继续工作。

我个人的偏好是greenrobot's EventBusBluetoothScanCompletedEvent位于Android支持包中,也可以填充该角色。 Square's Otto是Android的第三个主要事件总线,但其线程化方法可能不适合您的用例。

This directory包含演示所有三个事件总线实现的示例项目。

答案 1 :(得分:1)

有很多方法可以做到这一点,这最好取决于您的具体情况。一个没有外部依赖关系的简单解决方案是在iPhone中使用BroadcastReceiver,覆盖Activity并执行您想要执行的操作,例如弹出onReceive(),显示Dialog返回的一些String。在Service中,您可以执行您需要执行的操作,并在完成后使用Service发送LocalBroadcastManager广播。

这是一个最小的例子(MCVE,展示了你如何做到这一点(没有蓝牙部分,从你的问题来看似乎不是你的问题):

示例sendBroadcast

ActionBarActivity

示例public class MainActivity extends ActionBarActivity { private Dialog dialog; private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { dialog = new AlertDialog.Builder(MainActivity.this) .setTitle("Some title") .setMessage(intent.getExtras().getString("payload")) .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }) .create(); dialog.show(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); Button button = new Button(this); button.setText("Click!"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startService(new Intent(MainActivity.this, MyService.class)); } }); layout.addView(button); setContentView(layout); LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, new IntentFilter("MyAction")); } @Override public void onDestroy() { super.onDestroy(); LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver); if (dialog != null && dialog.isShowing()) dialog.dismiss(); } }

Service

示例public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { LocalBroadcastManager.getInstance(MyService.this).sendBroadcast(new Intent("MyAction").putExtra("payload", "Some string")); stopSelf(); } }, 3000); return START_NOT_STICKY; } }

AndroidManifest.xml