2016-12-06 67 views
0

我开始一个新的Service来下载一个Activity中的数据库文件,并且我也有一个里面的Fragment,它使用下载的数据库文件中的数据来设置它的布局。那么,是否有任何方法或方法知道IntentService已完成下载,然后我可以将Fragment附加到Activity下载后更新版面

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

回答

0

使用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")); 
onDestroy功能

现在,在您Activity注销接收器。

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

现在从Service你开始,当下载完成后,您可能需要通知回到你Activity有关。所以,你需要像这样从你的Service发送广播。

sendBroadcast(new Intent("DOWNLOAD_COMPLETE")); 

希望有帮助。

+0

感谢它解决了这个问题,但它仍然不明白工作,我必须做一些学习。 – Nsnik

+0

这很简单。您需要有一个接收器才能继续收听下载并完成下载,您只需将广播发送到接收器即可。只要接收器接收到广播,就会调用'onReceive'函数。 –

+0

永远不会在'onDestroy'上取消注册接收器!这是永远不能保证被称为 – HendraWD

0

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

  1. BroadcastReceiver

  2. 发布/订阅事件总线(OttoEventBus

  3. 可观察模式(RxJavaRxAndroid

如果你不知道每个也就是说,您可以从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这里,因为它是更有效和安全的

1

注册一个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); 

您也可以putExtras你的意图,如果你需要传递一些值。

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

+0

感谢您的教程链接 – Nsnik

+0

欢迎Nsnik。 –