2013-04-15 189 views
0

嗨我试图从我的主要活动从ScreenReceiver类调用一个方法。我发现这一点,并将其实施到我的代码中。另一种方法调用方法?

MainActivity:

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // ScreenRecv 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     BroadcastReceiver mReceiver = new ScreenReceiver(); 
     registerReceiver(mReceiver, filter); 
    } 

    // Toast(String) 
    public void Toast(String text) { 
     Toast.makeText(MainActivity.this, "" + text, Toast.LENGTH_SHORT).show(); 
    } 
} 

ScreenReceiver:

package com.wifitimer; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class ScreenReceiver extends BroadcastReceiver { 
    public static boolean wasScreenOn = true; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      new MainActivity().Toast("Screen Off"); 
      wasScreenOn = false; 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      new MainActivity().Toast("Screen On"); 
      wasScreenOn = true; 
     } 
    } 
} 

我没有得到任何错误,但也敬酒不显示。有任何想法吗?

的logcat:

04-16 00:53:35.470: I/WifiManager(19123): setWifiEnabled : true 
04-16 00:53:57.135: D/AndroidRuntime(19123): Shutting down VM 
04-16 00:53:57.135: W/dalvikvm(19123): threadid=1: thread exiting with uncaught exception (group=0x416922a0) 
04-16 00:53:57.140: E/AndroidRuntime(19123): FATAL EXCEPTION: main 
04-16 00:53:57.140: E/AndroidRuntime(19123): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.SCREEN_OFF flg=0x50000010 } in [email protected] 
04-16 00:53:57.140: E/AndroidRuntime(19123): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:765) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at android.os.Handler.handleCallback(Handler.java:615) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at android.os.Looper.loop(Looper.java:137) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at android.app.ActivityThread.main(ActivityThread.java:4898) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at java.lang.reflect.Method.invokeNative(Native Method) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at java.lang.reflect.Method.invoke(Method.java:511) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at dalvik.system.NativeStart.main(Native Method) 
04-16 00:53:57.140: E/AndroidRuntime(19123): Caused by: java.lang.NullPointerException 
04-16 00:53:57.140: E/AndroidRuntime(19123): at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:101) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at com.wifitimer.MainActivity.Toast(MainActivity.java:107) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at com.wifitimer.ScreenReceiver.onReceive(ScreenReceiver.java:13) 
04-16 00:53:57.140: E/AndroidRuntime(19123): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:755) 
04-16 00:53:57.140: E/AndroidRuntime(19123): ... 9 more 
04-16 00:53:57.445: I/Process(19123): Sending signal. PID: 19123 SIG: 9 
+0

重构代码以显示您真正使用的组件。没有这些信息,你的问题就会令人困惑。 –

+0

我已添加上面的完整代码:) – KickAss

回答

3

您的通话不应该实际工作,因为你需要养活Context作为第一个参数makeText。由于你的类不是从上下文或一个活动或类似的东西派生的,它甚至不应该编译。

看看documentation

现在跟你的代码显示,您目前的问题是这样的:

new MainActivity().Toast("Screen Off"); 

你已经有一个实例化MainActivity,你不需要例如一个新的。现在,如果你想使用的第一个类的方法,有一两件事你可以做的是增加一个构造函数为您ScreenReceiver

MainActivity myContext; 
public ScreenReceiver(MainActivity context){ 
    myContext = context; 
} 

,并在的onReceive方法改变该行

myContext.Toast("Screen Off"); 

和例如,您需要将该行更改为

BroadcastReceiver mReceiver = new ScreenReceiver(this); 
+0

B是主要活动的子类 – KickAss

+1

即便如此。您需要将“this”更改为MainActivity.this,以便代码正常工作。 (当然,取决于你的课程名称) – DigCamara

+0

嘿谢谢你。我刚刚尝试了您的建议,但仍然无效。我将LogCat添加到上面的主文章中。 – KickAss

0

当您创建Toast时,第一个参数需要是上下文。因此,B需要是活动/服务/应用程序的子类,或者您需要将其构造函数中的B引用传递给有效的上下文。或者,您可以继承应用程序并提供静态getContext方法。

+0

B是mainactivity的子类 – KickAss

+0

请不要建议创建静态getContext方法。这对于意大利面代码来说是一个好的开始。 –

+0

我已经添加了上面的完整代码。我将MainActivity.this添加到祝词中,但仍然无法使用。 – KickAss

0

您不能直接实例化活动。在A内使用 startActivity(this, B.class);,并从B生命周期方法内调用methodB。

编辑,以匹配编辑问题:

如果你只是想显示吐司,做到在BroadcastReceiver直接:如果你想打电话组件的功能

Toast.makeText(context, "Screen On/Off", Toast.LENGTH_SHORT).show(); 

Activity) ,它创建了BroadcastReceiver,最好添加回调接口并实现在Activity中,通过构造函数(如DigCamara在他的回答中所述)或setter发送到BroadcastReceiver并在需要时调用。

注:

  1. 你不ActivitiesServices直接实例。它根本不会工作。
  2. 您需要注销BroadcastReceiver在匹配功能(在您的情况下onDestroy)。
  3. 不要将数据保存在静态变量中:public static boolean wasScreenOn = true;。在进程被终止并重新启动后,您将丢失这些数据。
+0

查看主后。添加完整的代码 – KickAss