在没有上下文的情况下启动意图

时间:2014-02-22 18:37:58

标签: android android-intent start-activity

处理以下情况的最佳方法是什么: 我有一个与服务器同步的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();
}

2 个答案:

答案 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