how to start the app on power button press

后端 未结 3 679
迷失自我
迷失自我 2020-12-09 14:36

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.

相关标签:
3条回答
  • 2020-12-09 14:49

    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>
    
    0 讨论(0)
  • 2020-12-09 14:52

    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);
        }
    
    }
    
    0 讨论(0)
  • 2020-12-09 15:12

    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>
    

    0 讨论(0)
提交回复
热议问题