2016-12-06 73 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。 –