how to start the app on power button press

19,776

Solution 1

First, unlike other broad casted intents, for Intent.ACTION_SCREEN_OFF and Intent.ACTION_SCREEN_ON you CANNOT declare them in your Android Manifest! so You need to make a service which will keep on running like this

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
            }
        }
}

and your receiver can be something

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

}

Solution 2

Here is my complete code. Hope this helps. I was basically making a look screen app. This will disable your default lock screen. and on power button press it will start a service and runs to look for power button press event.

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>

Solution 3

Here this one is the complete code, which will open your application as soon you presss power button. I am also doing the same project, where i want to open my Application directly after i press power button (turn on).

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

Now this is xml file, Please copy paste and just change the package name you are using

 <?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>

Share:
19,776

Related videos on Youtube

Qadir Hussain
Author by

Qadir Hussain

Senior Software Engineer (Android, NodeJS)

Updated on July 18, 2022

Comments

  • Qadir Hussain
    Qadir Hussain almost 2 years

    I want to start my app when a user press the power button. I m following This code but its not showing any Log and toast.

    here is my complete code.

    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
    
    }
    
    }
    

    menifest File

    <?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;
    }
    
    }
    
    • I think i m committing a mistake in my menifest file. please have a look on this. thanks.
  • Qadir Hussain
    Qadir Hussain about 11 years
    ScreenReceiver is undefined? what is this.
  • DjHacktorReborn
    DjHacktorReborn about 11 years
    update m answer that was your receiver class i have posted that code also
  • Qadir Hussain
    Qadir Hussain about 11 years
    Thanks for rplying but what about the menifest file.?
  • Qadir Hussain
    Qadir Hussain about 11 years
    Its not working still. can you please modify my menifest file. according to your code.
  • DjHacktorReborn
    DjHacktorReborn about 11 years
    You need to add <service android:name=". UpdateService"/> and run this service from activity via context.startService(new Intent(this, UpdateService.Class));
  • surhidamatya
    surhidamatya about 11 years
    @DjHacktorReborn can you help me i am getting "unable to start componentinfo" error