下载后更新布局

时间:2016-12-06 09:17:42

标签: android android-fragments android-service

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

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

3 个答案:

答案 0 :(得分:1)

在您的活动中注册一个类似于:

的BroadcastReceiver
function Redirect() {
    if ('@Html.Raw(Model)'.indexOf(window.location.protocol) != -1) {
        window.location.href = '@Html.Raw(Model)';
    } else {
        var origin = window.location.origin || (window.location.protocol + '//' + window.location.host);
        window.location.href = origin + '@Html.Raw(Model)';
    }
}
setTimeout('Redirect()', 10);

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

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

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

如果你需要传递一些值,你也可以在你的意图上加上。(/ p>)

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

答案 1 :(得分:0)

有一些方法可以通过服务通知用户界面。

  1. BroadcastReceiver

  2. 发布/订阅活动总线(OttoEventBus

  3. 可观察格局(RxJavaRxAndroid

  4. 如果你不确定每一个是什么,你可以从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);
        }
    }
    

    以下是您的活动

    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,因为它更有效,更安全

答案 2 :(得分:0)

使用BroadcastReceiver。正如@HendraWD在他的回答中所述,还有许多其他方式可以获得有关下载的通知,您可以尝试BroadcastReceiver

因此,在Activity内部创建BroadcastReceiver就像这样。

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

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

BroadcastReceiver的{​​{1}}功能中,首先注册onCreate

Activity

现在在BroadcastReceiver registerReceiver(mReceiver, new IntentFilter("DOWNLOAD_COMPLETE")); 函数中取消注册接收器。

onDestroy

现在,从您开始的Activity开始,下载完成后,您可能需要通知您@Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); } 。所以,您需要像这样发送Service广播。

Activity

希望有所帮助。