下载后更新布局

Update layout after download

我正在开始一个新的 Service 以在 Activity 中下载数据库文件,并且我在 Activity 中还有一个 Fragment 使用来自下载数据库文件以设置其布局。那么,有什么方法可以知道 IntentService 已经完成下载,然后我可以将 Fragment 附加到 Activity.

Intent intent = new Intent(StartActivity.this, DownloadService.class);
startService(intent);
getSupportFragmentManager().beginTransaction().replace(R.id.startContainer,new ChartFragment()).commit();

有一些方法可以从服务中通知 UI。

  1. BroadcastReceiver

  2. Publish/subscribe 事件总线(Otto, EventBus)

  3. 可观察模式(RxJava, RxAndroid)

如果您不确定每个是什么,您可以只从 BroadcastReceiver 开始。这是 Android 提供的标准方式。

这是一个简单的示例,说明如何使用它。您的服务将如下所示:

public class YourService extends IntentService {

    public YourService() {
        super("YourService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        //your process..

        //process done
        Intent broadcastIntent = new Intent("Your filter");
        broadcastIntent.putExtra("param you want to pass", "value");
        LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);
    }
}

这是你的activity样子

public class YourActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = new Intent(YourActivity.this, YourService.class);
        startService(intent);
    }

    BroadcastReceiver yourBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //do something
            Log.d(YourActivity.class.getSimpleName(), "broadcast receiver called");
        }
    };

    @Override
    protected void onStart() {
        LocalBroadcastManager.getInstance(this).registerReceiver(yourBroadcastReceiver, new IntentFilter("Your filter"));
        super.onStart();
    }

    @Override
    protected void onStop() {
        LocalBroadcastManager.getInstance(this).unregisterReceiver(yourBroadcastReceiver);
        super.onStop();
    }
}

我在这里使用 LocalBroadcastManager 因为它更高效和安全

使用 BroadcastReceiver。正如@HendraWD 在他的回答中所述,还有许多其他方法可以通知下载已完成,您可以尝试 BroadcastReceiver 在您的情况下。

所以在你的 Activity 中创建一个像这样的 BroadcastReceiver

private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        // Launch your Fragment here
    }
};

检查 BroadcastReceiveronReceive 功能。如果您注册 BroadcastReceiver 然后正确通知,下载完成时将调用 onReceive 函数。我在这里添加一些代码示例。

在你的ActivityonCreate函数中,先注册BroadcastReceiver

registerReceiver(mReceiver, new IntentFilter("DOWNLOAD_COMPLETE"));

现在在 Activity 中的 onDestroy 函数中注销接收器。

@Override
public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(mReceiver);
}

现在从您 Service 开始,下载完成后,您可能需要将这件事通知给您的 Activity。因此,您需要像这样从 Service 发送广播。

sendBroadcast(new Intent("DOWNLOAD_COMPLETE"));

希望对您有所帮助。

在您的 Activity 中注册一个 BroadcastReceiver,例如:

 BroadcastReceiver  myReceiver = new BroadcastReceiver() {
   @Override
 public void onReceive(Context context, Intent intent) {
    // do my stuff
}
};

registerReceiver(myReceiver , new IntentFilter("com.myapp.DOWNLOADCOMPLETE"));

然后在您的服务中发送广播:

// use intent to send broadcast
Intent i = new Intent("com.myapp.DOWNLOADCOMPLETE");
sendBroadcast(i);

如果您需要传递一些值,您也可以将 Extras 添加到您的意图中。

可以找到关于 Android 服务和后台处理的 Google 教程 here