2017-03-06 208 views
2

我是新的android我想實現在我那時,當我按下電源按鈕我需要打開應用程序,但應用程序在最近應用程序托盤的背景。我想這是我得到了所有的解決方案,但我沒有得到解決重新啓動應用程序時,即使應用程序從最近的應用程序托盤中死亡後點擊電源按鈕

MainActivity.class

public class MainActivity extends ActionBarActivity { 

    Intent intent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
     setContentView(R.layout.activity_main); 
     /*Toast.makeText(getApplicationContext(),"main Activity run",Toast.LENGTH_SHORT).show(); 
     intent = new Intent(new Intent(getBaseContext(), PowerService.class)); 
     startService(intent);*/ 
//  /* new Handler().post(new Runnable() { 
//   @Override 
//   public void run() { 
       Toast.makeText(getApplicationContext(),"service run",Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(new Intent(MainActivity.this, PowerService.class)); 
       startService(intent); 
//   } 
//  }); 
//*/ 

//  Intent notificationIntent = new Intent(this, PowerService.class); 
//  PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
// 
//  
// 


    } 


    @Override 
    protected void onStart() { 




     Toast.makeText(getApplicationContext(),"inside mainactivity onStart",Toast.LENGTH_SHORT).show(); 
     super.onStart(); 
    } 

    @Override 
    protected void onResume() { 
     Toast.makeText(getApplicationContext(),"inside mainactivity onResume",Toast.LENGTH_SHORT).show(); 
     super.onResume(); 
    } 

    @Override 
    protected void onRestart() { 
     Toast.makeText(getApplicationContext(),"inside mainactivity onRestart",Toast.LENGTH_SHORT).show(); 
     super.onRestart(); 
    } 

    @Override 
    protected void onDestroy() { 
     Toast.makeText(getApplicationContext(),"inside mainactivity onDestroy",Toast.LENGTH_SHORT).show(); 
     super.onDestroy(); 
    } 

    @Override 
    protected void onStop() { 
     Toast.makeText(getApplicationContext(),"service run",Toast.LENGTH_SHORT).show(); 
     Intent intent = new Intent(new Intent(MainActivity.this, PowerService.class)); 
     startService(intent); 
     Toast.makeText(getApplicationContext(),"inside mainactivity onStop",Toast.LENGTH_SHORT).show(); 
     super.onStop(); 
    } 
} 

Service.class

public class PowerService extends Service { 

    BroadcastReceiver mReceiver; 
    IntentFilter filter; 

    @Override 
    public IBinder onBind(Intent intent) { 

     return null; 
    } 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock cpuWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); 
     cpuWakeLock.acquire(); 
     registerReciver(); 

     return Service.START_STICKY; 
    } 
    public class LocalBinder extends Binder { 
     PowerService getService() { 
      return PowerService.this; 
     } 
    } 

    @Override 
    public boolean onUnbind(Intent intent) { 
     System.out.println("inside powerservice onUnbind"); 
     Toast.makeText(getApplicationContext(),"inside powerservice onUnbind",Toast.LENGTH_SHORT).show(); 
     return super.onUnbind(intent); 
    } 

    @Override 
    public void onRebind(Intent intent) { 
     System.out.println("inside powerservice onRebind"); 
     Toast.makeText(getApplicationContext(),"inside powerservice onRebind",Toast.LENGTH_SHORT).show(); 
     super.onRebind(intent); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 

     System.out.println("inside powerservice onStart"); 

     super.onStart(intent, startId); 
    } 

    @Override 
    public void onDestroy() { 
     //unregisterReceiver(mReceiver); 
     //registerReciver(); 
     System.out.println("inside powerservice onDestroy"); 
     Toast.makeText(getApplicationContext(),"inside powerservice ondestroy",Toast.LENGTH_SHORT).show(); 
     startService(new Intent(this, PowerService.class)); 
     super.onDestroy(); 



    } 

    @Override 
    public void onTaskRemoved(Intent rootIntent) { 
     /*registerReciver(); 
     startService(new Intent(this,PowerService.class));*/ 
     Toast.makeText(getApplicationContext(),"inside powerservice onTaskRemoved",Toast.LENGTH_SHORT).show(); 
     /*Intent broadcastIntent = new Intent(this,AppReciever.class); 
     sendBroadcast(broadcastIntent); 
     super.onTaskRemoved(rootIntent);*/ 
     /* Intent restartServiceTask = new Intent(this,PowerService.class); 
     restartServiceTask.setPackage(getPackageName()); 
     PendingIntent restartPendingIntent =PendingIntent.getService(getApplicationContext(), 1,restartServiceTask, PendingIntent.FLAG_ONE_SHOT); 
     AlarmManager myAlarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
     myAlarmService.set(
       AlarmManager.ELAPSED_REALTIME, 
       SystemClock.elapsedRealtime() + 1000, 
       restartPendingIntent); 


     startService(new Intent(this,PowerService.class));*/ 
     super.onTaskRemoved(rootIntent); 
    } 

    public void registerReciver() 
    { 
     filter= new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     filter.addAction(Intent.ACTION_USER_PRESENT); 
     filter.addAction(Intent.ACTION_LOCKED_BOOT_COMPLETED); 
     mReceiver = new AppReciever(); 
     registerReceiver(mReceiver, filter); 
    } 
} 

BroadcastReciever

​​

manifest資源配置文件

package="com.benayah.app.sampleapp"> 

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <uses-permission android:name="android.permission.GET_TASKS"/> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <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> 
     <service android:name=".PowerService" 
      android:enabled="true" 
      android:exported="false" 
      android:stopWithTask="false" 
      android:process=":my_process" 
      > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED"/> 
       <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> 
     </service> 
    </application> 

請讓我知道我的代碼出錯了,我需要在後臺運行服務來檢查屏幕,即使應用程序在後臺死亡,因爲現在當我殺了應用程序,我無法重新啓動我的應用程序,但如果我不殺它工作正常

回答

0

使用以下可能是有益的......

***在清單

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

<receiver android:name=".BootCompleteReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

public class BootCompleteReceiver extends BroadcastReceiver { 

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

    Intent intent= new Intent(context, ActivitySample.class); 
    context.startActivity(intent); 

} 

}

+0

沒有。不工作也嘗試了這一點 – Bharamu

0

下面你可能是有益的......

清單中

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

public class MyReceiver extends BroadcastReceiver { 
static int countPowerOff=0; 
private Activity activity=null; 
public MyReceiver (Activity activity) 
{ 
this.activity=activity; 
} 
@Override 
public void onReceive(Context context, Intent intent) { 

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

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

if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) 
{ 
countPowerOff++;  
} 
else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) 
{ 
    if(countPowerOff==5) 
    { 
     Intent i =new Intent(activity,NewActivity.class); 
     activity.startActivity(i); 
    } 
} 

} 

而且,

公共類MainActivity擴展活動{

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     MyReceiver mReceiver = new MyReceiver (this); 
     registerReceiver(mReceiver, filter); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 
0

我知道顯示器的電源按鈕的唯一方法是通過聽取ScreenOnSCREENOFF事件。因此,您可以嘗試編寫一個正在偵聽ScreenOn或ScreenOff的服務,然後每次該事件觸發時都可以啓動所需的應用程序。

MainActivity:

public class MainActivity extends AppCompatActivity { 

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

     Intent intent = new Intent(this, ScreenOnOffService.class); 
     startService(intent); 
    } 
} 

服務:

public class ScreenOnOffService extends Service { 

    private ScreenOnOffReceiver mScreenReceiver; 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     registerScreenStatusReceiver(); 
    } 

    @Override 
    public void onDestroy() { 
     unregisterScreenStatusReceiver(); 
    } 

    private void registerScreenStatusReceiver() { 
     mScreenReceiver = new ScreenOnOffReceiver(); 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     filter.addAction(Intent.ACTION_SCREEN_ON); 
     registerReceiver(mScreenReceiver, filter); 
    } 

    private void unregisterScreenStatusReceiver() { 
     try { 
      if (mScreenReceiver != null) { 
       unregisterReceiver(mScreenReceiver); 
      } 
     } catch (IllegalArgumentException e) {} 
    } 
} 

清單:

<service android:name="com.benayah.app.sampleapp.ScreenOnOffService" /> 

廣播接收器:

(在這裏你需要把你要啓動的應用程序的包名) 在我的例子,我把你的包名稱:com.benayah.app.sampleapp

public class ScreenOnOffReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      Log.d("StackOverflow", "Screen Off"); 
      startApp(context); 

     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      Log.d("StackOverflow", "Screen On"); 
      startApp(context); 
     } 
    } 

    private void startApp(Context context) { 
     PackageManager pm = context.getPackageManager(); 
     Intent launchIntent = pm.getLaunchIntentForPackage("com.benayah.app.sampleapp"); 
     context.startActivity(launchIntent); 
    } 
} 
相關問題