2013-04-15 188 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