如何在后台运行服务

7 android android-intent android-service android-broadcast

我创建的应用程序会在用户按下电源按钮3次后立即启动活动.经过一些研究,我发现要做到这一点,首先你需要创建一个服务,启动广播接收器来检查屏幕的开/关状态.

基本上我希望即使应用程序关闭也能运行.一旦按下电源按钮3次或更多次,它应该开始另一个活动.

如果您知道解决方案,请给我完整的代码或答案的链接.

我以某种方式设法编写此代码,但它无法正常工作:

UpdateService.java

这是我使用的服务类:

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;
 }
}
Run Code Online (Sandbox Code Playgroud)

MyReceiver.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

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);
 }
}
Run Code Online (Sandbox Code Playgroud)

mainfest.xml

<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF"/>
<action android:name="android.intent.action.SCREEN_ON"/>
</intent-filter>
</receiver>
<service android:name=".UpdateService" />
Run Code Online (Sandbox Code Playgroud)

还请提及我是否必须在我的mainactivity.java文件中包含任何内容或重定向到的活动.

我使用过这些权限:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Run Code Online (Sandbox Code Playgroud)

小智 0

没有完整的代码可以确定,但让我做出一个有根据的猜测:

您没有实施应用程序或活动是吗?

我认为您至少需要其中之一来在 onCreate() onResume() 回调中注册接收器,简单地在清单中声明接收器可能不起作用。

在 Eclipse 或任何其他具有 Android 集成的 IDE 中进行调试非常有帮助,因为它显示了应用程序的进程,并且您可以确定它们是否已启动。稍加调试就可以告诉您接收器是否正常工作。

如果您愿意分享更多代码,我们当然可以进一步讨论。