下载后更新布局
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。
如果您不确定每个是什么,您可以只从 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
}
};
检查 BroadcastReceiver
的 onReceive
功能。如果您注册 BroadcastReceiver
然后正确通知,下载完成时将调用 onReceive
函数。我在这里添加一些代码示例。
在你的Activity
的onCreate
函数中,先注册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。
我正在开始一个新的 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。
如果您不确定每个是什么,您可以只从 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
}
};
检查 BroadcastReceiver
的 onReceive
功能。如果您注册 BroadcastReceiver
然后正确通知,下载完成时将调用 onReceive
函数。我在这里添加一些代码示例。
在你的Activity
的onCreate
函数中,先注册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。