【问题标题】:How can I get the application context from an Android Service?如何从 Android 服务获取应用程序上下文?
【发布时间】:2011-11-29 03:32:22
【问题描述】:

我有一个正在运行并监听麦克风输入的 Android 服务。我希望它在满足特定条件时启动一项活动。为了创建一个意图,我需要应用程序上下文。我怎样才能得到它?

Intent i = new Intent(ctx, SONR.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(i);

以上行没有开始我的活动。

这是我的构造函数

public SONRClient(Context c, AudioRecord ar, int buffsize, final AudioManager am) {
    theAudioManager = am;
    theaudiorecord = ar;
    bufferSize = buffsize;
    ctx = c;
    CLIENT_ON = true;
}

这是我的 onCreate

@Override
public void onCreate() {
    try {
        // LogFile.MakeLog("\n\nSONRClient CREATED");
        clientStopReceiver = new StopReceiver();
        ctx.registerReceiver(clientStopReceiver, 
            new IntentFilter(SONR.DISCONNECT_ACTION));
        myByteReceiver = new SONRByteReceiver();
        theListener = new MicSerialListener(
            theaudiorecord, bufferSize, myByteReceiver);
        theApplication = getApplication();
    } catch (Exception e) {
        e.printStackTrace();
        ErrorReporter.getInstance().handleException(e);
    }
}

有 myByteReceiver 正在通过音频输入监听信号。当它找到匹配的信号时,我希望它启动一个活动。

private class SONRByteReceiver implements ByteReceiver {
    private long lastplaytime = 0;
    private long lastmutetime = 0;
    private long lastskiptime = 0;
    private long lastvolutime = 0;
    private long lastbacktime = 0;

    public void receiveByte(int receivedByte) {
        try {
            theKeyEvent = -1;

            if (ismuted) {
                if (receivedByte != MUTE) {
                    volume = 0;
                    ismuted = false;
                }
            }

            switch (receivedByte) {

            case SONR_HOME:
                Log.d(TAG, "HOME");

                Intent i = new Intent(ctx, SONR.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                theApplication.startActivity(i);

                break;
            default:
                Log.d(TAG, "default");
                Log.d(TAG,"RECEIVED " + receivedByte);
                // LogFile.MakeLog("RECEIVED " + receivedByte);
                break;
            }

            if (theKeyEvent >= 0) {
                sendbroadcast();
            }
        } catch (Exception e) {
            e.printStackTrace();
            ErrorReporter.getInstance().handleException(e);
        }
    }
}

这是堆栈跟踪

java.lang.NullPointerException
    at com.sonrlabs.test.sonr.SONRClient$SONRByteReceiver.receiveByte(SONRClient.java:320)
    at com.sonrlabs.test.sonr.AudioProcessor.processSample(AudioProcessor.java:145)
    at com.sonrlabs.test.sonr.AudioProcessor.run(AudioProcessor.java:58)

第 320 行是theApplication.startActivity(i);

【问题讨论】:

  • 能把你调用getApplicationContext的方法贴进去吗?
  • 如果你发布你得到的 NullPointerException 的日志会更有帮助。
  • 您的代码似乎都没有为 ctx 变量分配任何东西。查看您的代码以查看“ctx”在哪里被分配了一个值,并在分配周围做一些打印输出以查看它何时以及是否曾经被分配。
  • ctx 在我的构造函数中被赋值。我也可以发布该代码
  • 我还从上下文中打印出包名。它做得很好。问题出在 startActivity 中。不知道为什么。

标签: java android android-intent android-service android-activity


【解决方案1】:

您可以在服务中使用getApplicationContext() 来获取应用程序上下文。

尝试使用

getApplication().startActivity(i);

android start activity from service

【讨论】:

  • 尝试 getApplicationContext() 时出现空指针异常
  • 我更新了我的代码。我有上下文的参考,但我的活动没有出现。我做错了吗?
  • 你是如何开始服务的?您能否使用服务中更完整的代码来编辑您的问题,例如您尝试在哪些生命周期方法中启动活动?
  • 尝试将theApplication = getApplication();移动到onCreate的第一行
  • 仍然得到theApplication.startActivity(i);的空指针异常
【解决方案2】:

每个服务都有自己的上下文,只要使用那个。您不需要将服务传递给 Activity 的上下文。

Service 中不需要活动上下文。

Intent i = new Intent(ctx, SONR.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

就像在 Activity 中做的那样做

Service 和 Activity 都是 Context 的子类。

【讨论】:

    【解决方案3】:

    改变这个:

    Intent i = new Intent(ctx, SONR.class); 
    

    到:

    Intent i = new Intent(getApplicationContext(),SONR.class);
    

    【讨论】:

    • 不可能,您在其他地方得到空指针异常。如果您的服务正在运行,则上下文不能为空。
    • 尝试点击这一行:在 com.sonrlabs.test.sonr.AudioProcessor.processSample(AudioProcessor.java:145) 或上面的 n 行,找到 whr ur 为 null。跨度>
    【解决方案4】:

    您断言需要应用程序上下文来启动活动是不准确的。可以start an activity from any context,包括服务,就是一个上下文。

    【讨论】:

    • 我只使用 startActivity() 进行了尝试,但仍然得到空指针异常。用更多代码更新问题
    • 显示空指针的堆栈轨迹。如果您在该类中使用它,这不是因为 null 服务。
    • 问题中的堆栈跟踪是我调试时打印的全部内容。关于如何进一步调试的任何想法?
    【解决方案5】:

    getBaseContext() 返回上下文,因为每个活动都扩展了上下文类

    【讨论】:

      【解决方案6】:

      你不能在它的公共空构造函数中调用getApplicationContext(),否则它会给你一个NullPointerException

      【讨论】:

      • Service 类中的哪个位置是调用getApplicationContext() 的安全地方?
      • @JJD 不要调用 getApplicationContext(),而是像 Vishal Android Developer 所写的那样调用 getBaseContext()。
      • 问题仍然存在,在哪种方法中调用它是安全的。
      【解决方案7】:

      只有在服务的 'onCreate()' 之后才有非空上下文:在构造函数中获取服务的上下文不是一个好主意(还没有任何上下文),使用简单的 'getApplicationContext() ' 在 'onCreate' 方法中。

      【讨论】:

        【解决方案8】:
        ctx.getApplicationContext().startActivity(i)
        

        轰隆隆。

        【讨论】:

        • ctx 是什么?您是否从服务中启动上述指令?
        • @Lisitso ctx 是一个 Context 变量
        • 如果你已经有 ctx 作为 Context 为什么要获取应用程序上下文然后 startActivity?为什么不简单地 ctx.startActivity()?
        【解决方案9】:

        只需执行此操作即可访问服务上下文

        Intent i = new Intent(Service.this, SONR.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-22
          • 2016-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多