如何按电源按钮启动应用程序

时间:2013-03-08 10:57:53

标签: android broadcastreceiver android-manifest

我想在用户按下电源按钮时启动我的应用程序。我跟着This code 但它没有显示任何Log和吐司。

这是我的完整代码。

MyReceiver.java

import android.content.BroadcastReceiver;
   import android.content.Context;
   import android.content.Intent;
   import android.util.Log;
   import android.widget.Toast;

   public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    // TODO Auto-generated method stub

    Log.v("onReceive", "Power button is pressed.");

    Toast.makeText(context, "power button clicked", Toast.LENGTH_LONG)
            .show();

    // perform what you want here

}

}

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.powerbuttontest"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.powerbuttontest.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name=".MyReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.SCREEN_OFF" >
            </action>
            <action android:name="android.intent.action.SCREEN_ON" >
            </action>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" >
            </action>
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" >
            </action>
            <action android:name="android.intent.action.ACTION_SHUTDOWN" >
            </action>
        </intent-filter>
    </receiver>
</application>
</manifest>

MainActivity.java

package com.example.powerbuttontest;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}
  • 我想我在menifest file犯了一个错误。请看看这个。感谢。

3 个答案:

答案 0 :(得分:5)

首先,与其他广泛的意图不同,对于Intent.ACTION_SCREEN_OFF和Intent.ACTION_SCREEN_ON,您不能在Android Manifest中声明它们!所以你需要提供一个像这样继续运行的服务

public static class UpdateService extends Service {

        @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);
            BroadcastReceiver mReceiver = new Receiver();
            registerReceiver(mReceiver, filter);
        }

        @Override
        public void onStart(Intent intent, int startId) {
            boolean screenOn = intent.getBooleanExtra("screen_state", false);
            if (!screenOn) {
                // your code
            } else {
                // your code
            }
        }
}

你的接收器可能是什么

public class Receiver extends BroadcastReceiver {

    private boolean screenOff;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            screenOff = true;
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            screenOff = false;
        }
        Intent i = new Intent(context, UpdateService.class);
        i.putExtra("screen_state", screenOff);
        context.startService(i);
    }

}

答案 1 :(得分:4)

这是我的完整代码。希望这可以帮助。我基本上是一个看屏幕应用程序。这将禁用您的默认锁定屏幕。按下电源按钮,它将启动一项服务并运行以查找电源按钮按下事件。

Layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<Button
    android:id="@+id/button1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/toggleButton1"
    android:layout_marginTop="72dp"
    android:enabled="false"
    android:text="Settings" />

<ToggleButton
    android:id="@+id/toggleButton1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginTop="72dp"
    android:checked="true"
    android:textOff="Disable"
    android:textOn="Enable" />

</RelativeLayout>

MainActivity.java

package com.example.powerbuttontest;

import android.app.Activity;
import android.app.KeyguardManager;
import android.app.KeyguardManager.KeyguardLock;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.widget.ToggleButton;

public class MainActivity extends Activity {

ToggleButton btnToggleLock;
Button btnMisc;

Toast toast;

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

    btnMisc = (Button) findViewById(R.id.button1);
    btnToggleLock = (ToggleButton) findViewById(R.id.toggleButton1);

    toast = Toast.makeText(getApplicationContext(), "", Toast.LENGTH_SHORT);

    btnToggleLock.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if (btnToggleLock.isChecked()) {

                toast.cancel();
                toast.setText("Unlocked");
                toast.show();

                Log.i("Unlocked", "If");

                Context context = getApplicationContext();
                KeyguardManager _guard = (KeyguardManager) context
                        .getSystemService(Context.KEYGUARD_SERVICE);
                KeyguardLock _keyguardLock = _guard
                        .newKeyguardLock("KeyguardLockWrapper");
                _keyguardLock.disableKeyguard();

                MainActivity.this.startService(new Intent(
                        MainActivity.this, UpdateService.class));

            } else {

                toast.cancel();
                toast.setText("Locked");
                toast.show();

                Context context = getApplicationContext();
                KeyguardManager _guard = (KeyguardManager) context
                        .getSystemService(Context.KEYGUARD_SERVICE);
                KeyguardLock _keyguardLock = _guard
                        .newKeyguardLock("KeyguardLockWrapper");
                _keyguardLock.reenableKeyguard();

                Log.i("Locked", "else");

                MainActivity.this.stopService(new Intent(MainActivity.this,
                        UpdateService.class));

            }

        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);

    Log.i("onConfigurationChanged", "Called");
}

}

MyReciever.java

package com.example.powerbuttontest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {
private boolean screenOff;

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        screenOff = true;
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        screenOff = false;
    }
    Intent i = new Intent(context, UpdateService.class);
    i.putExtra("screen_state", screenOff);
    context.startService(i);
}

}

UpdateService.java

package com.example.powerbuttontest;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class UpdateService extends Service {

    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);
    mReceiver = new MyReceiver();
    registerReceiver(mReceiver, filter);
}

@Override
public void onDestroy() {

    unregisterReceiver(mReceiver);
    Log.i("onDestroy Reciever", "Called");

    super.onDestroy();
}

@Override
public void onStart(Intent intent, int startId) {
    boolean screenOn = intent.getBooleanExtra("screen_state", false);
    if (!screenOn) {
        Log.i("screenON", "Called");
        Toast.makeText(getApplicationContext(), "Awake", Toast.LENGTH_LONG)
                .show();
    } else {
        Log.i("screenOFF", "Called");
        // Toast.makeText(getApplicationContext(), "Sleep",
        // Toast.LENGTH_LONG)
        // .show();
    }
}

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

Menifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.powerbuttontest"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

    <receiver android:name=".MyReceiver" />

    <service android:name=".UpdateService" />
</application>

</manifest>

答案 2 :(得分:2)

这是完整的代码,只需按下电源按钮即可打开您的应用程序。我也在做同样的项目,我想在按下电源按钮后打开我的应用程序(打开)。

<强> MainActivity.java

 public class MainActivity extends Activity 
   {

   @Override
  protected void onCreate(Bundle savedInstanceState) 
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_switch_power_offon);

        startService(new Intent(getApplicationContext(), LockService.class));
    }//EOF Oncreate
    }//EOF Activity

<强> LockService.java

   public class LockService extends Service {

@Override
  public IBinder onBind(Intent intent) {
  return null;
  }
  @Override
  public void onCreate() {
  super.onCreate();
   }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) 
{
  final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
  filter.addAction(Intent.ACTION_SCREEN_OFF);
  filter.addAction(Intent.ACTION_USER_PRESENT);
  final BroadcastReceiver mReceiver = new ScreenReceiver();
 registerReceiver(mReceiver, filter);
 return super.onStartCommand(intent, flags, startId);
  }
 public class LocalBinder extends Binder 
{
  LockService getService() {
  return LockService.this;
 }
}//EOF SERVICE

<强> ScreenReceiver.java

public class ScreenReceiver extends BroadcastReceiver {


public static boolean wasScreenOn = true;

public void onReceive(final Context context, final Intent intent) {
Log.e("LOB","onReceive");

if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) 
{
        // do whatever you need to do here
        wasScreenOn = false;
        //Log.e("LOB","wasScreenOn"+wasScreenOn);
        Log.e("Screen ","shutdown now");
 } 
  else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) 
  {
        // and do whatever you need to do here
        wasScreenOn = true;
        Log.e("Screen ","awaked now");

        Intent i = new Intent(context, MainActivity.class);  //MyActivity can be anything which you want to start on bootup...
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);

    }
    else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT))
    {
        Log.e("LOB","userpresent");
      //  Log.e("LOB","wasScreenOn"+wasScreenOn);


    }
}

} // EOF SCREENRECEIVER.JAVA

现在这是xml文件,请复制粘贴,只需更改您正在使用的包名称

 <?xml version="1.0" encoding="utf-8"?>

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="21" />


<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.userpresent.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

        <service android:name="com.example.userpresent.LockService" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </service>
</application>