2

画面にメッセージを表示したいのですが、ONまたはOFFになります。上記のように、1 つのブロードキャスト レシーバーと 1 つのサービスを作成しました。

放送受信機のコード:

public class ScreenReceiver extends BroadcastReceiver {


private boolean screenOff;


@Override
public void onReceive(final Context context, Intent intent)
{
    if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) 
    {
        screenOff = true;
        //wasScreenOn = false;

        Log.v("$$$$$$", "In Method:  ACTION_SCREEN_OFF");
        Handler handler = new Handler() 
        {
            @Override
            public void handleMessage(Message msg) 
            {
                Toast.makeText(context, "OFF", Toast.LENGTH_SHORT).show();
            }
        };
        System.out.println("off");
       // context.startService(new Intent(context,UpdateService.class));
    } 
    else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
    {
        screenOff = false;
       // wasScreenOn = true;

        Log.v("$$$$$$", "In Method:  ACTION_SCREEN_ON");
        //context.startService(new Intent(context,UpdateService.class));
        Handler handler = new Handler() 
        {
            @Override
            public void handleMessage(Message msg) 
            {
                Toast.makeText(context, "ON", Toast.LENGTH_SHORT).show();
            }
        };
        System.out.println("off");
    }
    else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT))
    {
        Log.v("$$$$$$", "In Method:  ACTION_USER_PRESENT");
    }
    Intent i = new Intent(context, UpdateService.class);
    i.putExtra("screen_state", screenOff);
    context.startService(i);

   /* if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        // do whatever you need to do here
        wasScreenOn = false;
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        // and do whatever you need to do here
        wasScreenOn = true;
    }*/
}

}




public class UpdateService extends Service 
{
private BroadcastReceiver mReceiver;


@Override
public void onCreate() {
    super.onCreate();
    // register receiver that handles screen on and screen off logic
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    filter.addAction(Intent.ACTION_USER_PRESENT);
    mReceiver = new ScreenReceiver();
    registerReceiver(mReceiver, filter);
}

@Override
public void onStart(Intent intent, int startId) 
{
    boolean screenOn = intent.getBooleanExtra("screen_state", false);
    if (!screenOn) 
    {
        Toast.makeText(getApplication(), "OFFserv", Toast.LENGTH_SHORT).show();
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) 
        {
        // your code
        Handler handler = new Handler() 
        {
            @Override
            public void handleMessage(Message msg) 
            {
                Toast.makeText(getApplication(), "OFFserv", Toast.LENGTH_SHORT).show();
            }
        };
        }

    } else 
    {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
        {
        // your code
        Handler handler = new Handler() 
        {
            @Override
            public void handleMessage(Message msg) 
            {
                Toast.makeText(getApplication(), "ONserv",Toast.LENGTH_SHORT).show(); 
            }
        };
        }
    }
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) 
    {
        Toast.makeText(getApplication(), "OFFserv", Toast.LENGTH_SHORT).show();
    // your code
    Handler handler = new Handler() 
    {
        @Override
        public void handleMessage(Message msg) 
        {
            Toast.makeText(getApplication(), "OFFserv", Toast.LENGTH_SHORT).show();
        }
    };
    }
    else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
        {
        // your code
        Handler handler = new Handler() 
        {
            @Override
            public void handleMessage(Message msg) 
            {
                Toast.makeText(getApplication(), "ONserv", Toast.LENGTH_SHORT).show();
            }
        };
        }
}

@Override
public void onDestroy()
{
      super.onDestroy();
      Log.v("$$$$$$", "In Method: onDestroy()");

      if (mReceiver != null)
      {
            unregisterReceiver(mReceiver);
            mReceiver = null;
      }          

}

@Override
public IBinder onBind(Intent intent)
{
    // TODO Auto-generated method stub
    return null;
}

}

マニフェスト ファイル:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.screenreceiver"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
         android:name=".ExampleActivity"

     >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

 <receiver android:name="com.example.screenreceiver.ScreenReceiver">
    <intent-filter> 
        <action android:name="android.intent.action.SCREEN_ON" />
        <action android:name="android.intent.action.SCREEN_OFF" />
        <action android:name="android.Intent.ACTION_USER_PRESENT" />
    </intent-filter> 
</receiver>
    <service android:name=".UpdateService">

    </service> 



</application>

コードを実行しましたが、画面のオン/オフを切り替えるたびに画面にメッセージが表示されません。それを回避する方法は?

4

1 に答える 1

0

私は同じ問題を自分で研究しています。何らかの理由で、Android がマニフェストを通じて宣言された Screen_On または Screen_Off インテントを望んでいないことがわかりました。すでに良い投稿を書き直すのではなく、ここで見つけた解決策をリンクします... http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-意図/

于 2013-04-15T12:38:25.610 に答える