在我的应用程序中,我使用IntentService
从云下载文件。并在NotificationManager
中显示进度。我需要在Activity
中显示状态(下载/已完成或失败),这也是IntentService
。
我的问题是,当我关闭应用并将其打开后,我希望从IntentService
获取下载状态。
这是最好的方法吗?
答案 0 :(得分:3)
您可以通过调用活动中的bindService()
来让您的活动绑定到您的服务。根据{{3}}:
服务是"绑定"当应用程序组件绑定到它时 调用bindService()。绑定服务提供客户端 - 服务器 允许组件与服务交互的接口,发送 请求,获取结果,甚至跨进程使用 进程间通信(IPC)。绑定服务只运行 另一个应用程序组件绑定到它。多个组件可以 立即绑定到服务,但当所有这些服务解除绑定时,服务 被毁了。
此外:
当您想要与之交互时,您应该创建绑定服务 来自您的应用程序中的活动和其他组件的服务 将您的一些应用程序的功能暴露给其他应用程序, 通过进程间通信(IPC)。
documentation提供了一个功能齐全的例子。以下内容摘自提供的链接。
服务类:
public class LocalService extends Service {
// Binder given to clients
private final IBinder mBinder = new LocalBinder();
// Random number generator
private final Random mGenerator = new Random();
/**
* Class used for the client Binder. Because we know this service always
* runs in the same process as its clients, we don't need to deal with IPC.
*/
public class LocalBinder extends Binder {
LocalService getService() {
// Return this instance of LocalService so clients can call public methods
return LocalService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/** method for clients */
public int getRandomNumber() {
return mGenerator.nextInt(100);
}
}
活动类:
public class BindingActivity extends Activity {
LocalService mService;
boolean mBound = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onStart() {
super.onStart();
// Bind to LocalService
Intent intent = new Intent(this, LocalService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
// Unbind from the service
if (mBound) {
unbindService(mConnection);
mBound = false;
}
}
/** Called when a button is clicked (the button in the layout file attaches to
* this method with the android:onClick attribute) */
public void onButtonClick(View v) {
if (mBound) {
// Call a method from the LocalService.
// However, if this call were something that might hang, then this request should
// occur in a separate thread to avoid slowing down the activity performance.
int num = mService.getRandomNumber();
Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show();
}
}
/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
// We've bound to LocalService, cast the IBinder and get LocalService instance
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
}
在您的服务中,您可以定义您的活动可以调用的公共方法,例如轮询下载进度。请参阅文档以获得详细说明。
答案 1 :(得分:2)
有几种方法可以在Service
和Activity
之间建立通讯连接。我会建议这两个
首先,您可以使用好的库Otto
。使用Otto,您还可以使用@Produce
注释方法。使用此方法,您将返回有关下载的最新信息。当您@Subscribe
Activity
时,您会立即获得最新信息。 https://github.com/square/otto
如果您使用Android
内置DownloadManager
,则会使用Broadcast
返回更新和结果,您可以在Broadcast
中注册Service
Activity
和DownloadManager
。这样您就可以更新它们。我建议你使用{{1}},这太棒了。
http://developer.android.com/reference/android/app/DownloadManager.html