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();
    }
}

スクリーンレシーバー:

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 com.wifitimer.ScreenReceiver@42312238
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
4

3 に答える 3

3

Contextへの最初のパラメーターとしてフィードする必要があるため、呼び出しは実際には機能しませんmakeText。また、クラスは Context や Activity などから派生していないため、コンパイルすることさえできません。

ドキュメントを参照してください。

コードが表示されているので、現在抱えている問題は次のとおりです。

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

インスタンス化された MainActivity が既にあるため、新しいものをインスタンス化する必要はありません。ここで、最初のクラスのメソッドを使用したい場合、できることの 1 つは、ScreenReceiver のコンストラクターを追加することです。

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

onReceive メソッドで、その行を次のように変更します。

myContext.Toast("Screen Off");

変更したクラスをインスタンス化するには、その行を次のように変更する必要があります

BroadcastReceiver mReceiver = new ScreenReceiver(this);
于 2013-04-15T23:30:51.177 に答える
0

アクティビティを直接インスタンス化することはできません。A 内で使用startActivity(this, B.class);し、B ライフサイクル メソッド内から methodB を呼び出します。

編集した質問に合わせて編集します。

Toast を表示したいだけの場合は、次のようにBroadcastReceiver直接実行します。

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

Activityを作成したコンポーネント ( ) で関数を呼び出したい場合は、BroadcastReceiverコールバック インターフェイスを追加して に実装し、Activityコンストラクター経由で送信する (DigCamara が彼の回答で述べたように) かBroadcastReceiver、必要に応じてセッターを呼び出して呼び出すのが最善です。

ノート:

  1. インスタンス化せずActivitiesServices直接。それは単に機能しません。
  2. BroadcastReceiver一致する関数で登録を解除する必要があります(あなたの場合onDestroy)。
  3. データを静的変数に保持しないでください: public static boolean wasScreenOn = true;. プロセスが強制終了されて再起動されると、このデータは失われます。
于 2013-04-15T23:38:29.810 に答える
0

Toast を作成するとき、最初のパラメーターは Context である必要があります。したがって、B はアクティビティ/サービス/アプリケーションのサブクラスである必要があるか、そのコンストラクターで B への参照を有効なコンテキストに渡す必要があります。別の方法として、Application をサブクラス化し、静的な getContext メソッドを提供することもできます。

于 2013-04-15T23:31:34.740 に答える