处理以下情况的最佳方法是什么: 我有一个与服务器同步的IntentService(这是由活动到达前台或GCM消息触发的,所以偶尔会这样)。有时需要用户操作,并且给定的命令/请求是响应XML的一部分。
基本上有两个选项,它可以是是/否问题,也可以是完整的活动,例如选择所需的语言。
我该怎么做,或者最好的方法是什么?如果我尝试使用IntentService的上下文启动Activity,则不会发生任何事情。我可以写一个抽象的Activity,我在我的所有活动中扩展并发送一条广播消息,接收并随后启动活动形成活动的活动,但不知道这是否是在Android中执行此操作的最佳方式
任何建议都将不胜感激!
[编辑:如建议的一些代码]
public class SyncService extends IntentService{
public SyncService(){
super("SyncService");
}
@Override
protected void onHandleIntent(Intent intent) {
iDomsAndroidApp app = ((iDomsAndroidApp) getApplicationContext());
DataManager manager = app.getDataManager();
manager.updateData(this);
}
}
public class DataManager {
// For brevity, this is called with the DOM.Document with the actions to be preformed
private void checkForActions(Document doc, SyncUpdateInterface syncInterface){
NodeList objects = null;
NodeList rootNodes = doc.getElementsByTagName("actions");
for (int j = 0; j < rootNodes.getLength(); j++) {
Element rootElement = (Element) rootNodes.item(j);
if (!rootElement.getParentNode().getNodeName().equals("iDoms")) {
continue;
}
objects = ((Element) rootNodes.item(j)).getElementsByTagName("action");
break;
}
if(objects == null || objects.getLength() == 0){
Log.d(iDomsAndroidApp.TAG, "No actions");
return;
}
for (int j = 0; j < objects.getLength(); j++) {
Element element = (Element) objects.item(j);
String action = ((Element) element.getElementsByTagName("command").item(0)).getTextContent();
if(action == null) return;
Log.d(iDomsAndroidApp.TAG, "Action: " + action);
try{
if(action.equalsIgnoreCase("selectLanguage")){
if(syncInterface == null || syncInterface.getContext() == null) throw new Exception("No context, so cannot perform action");
iDomsAndroidApp app = ((iDomsAndroidApp) iDomsAndroidApp.getAppContext());
// The app.actionIntent is just a central function to pick the right intent for an action.
syncInterface.getContext().startActivity(app.actionIntent("settings", iDomsAndroidApp.context));
} else if (action.equalsIgnoreCase("markAllAsRead")) {
if(syncInterface == null | syncInterface.getContext() == null) throw new Exception("No context, so cannot perform action");
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(syncInterface.getContext());
alertDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// User clicked OK, so save the result somewhere
// or return them to the component that opened the dialog
iDomsAndroidApp app = ((iDomsAndroidApp) iDomsAndroidApp.getAppContext());
app.getDataManager().markAllAsRead(null);
}
});
alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
}
});
alertDialogBuilder.setTitle(iDomsAndroidApp.context.getString(R.string.markAllAsRead));
alertDialogBuilder.setMessage(iDomsAndroidApp.context.getString(R.string.markAllAsReadText));
alertDialogBuilder.show();
}
} catch (Exception e){
Log.w(iDomsAndroidApp.TAG, "Problem performing the action " + element.getTextContent(), e);
sentCrashReport("Problem performing the action " + element.getTextContent(), e);
}
}
}
我尝试使用我的SyncInterface,因为它提供了IntentService的上下文,但认为它是一个但很笨拙但不起作用:
public interface SyncUpdateInterface {
public void doProgress(String message, int increment, int total);
public void doProgress(String message, int increment);
public void doProgress(String message);
public Context getContext();
}
答案 0 :(得分:0)
您可能需要重新考虑您的方法。 intentservice仅在onHandleIntent()方法的持续时间内存在。也就是说,一旦达到onHandleIntent()方法的最后一行代码,IntentService就会自行停止。
答案 1 :(得分:0)
尝试EventBus。它通过在应用程序的组件(活动,服务,独立类)之间进行通信来提供类似问题的解决方案。
使用Gradle导入库
compile 'org.greenrobot:eventbus:3.1.1'
定义一个事件
public class MessageEvent { /* Additional fields if needed */ }
使用
启动活动EventBus.getDefault().post(new MessageEvent());
注册组件以接收活动
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
即使通过声明此方法
也会启动接收@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
有关详细信息,请访问https://github.com/greenrobot/EventBus