【问题标题】:How I can create a Background service in android?如何在android中创建后台服务?
【发布时间】:2018-02-13 21:34:24
【问题描述】:

我需要创建一个服务,让我的应用程序在我关闭它时也能正常工作,我尝试过使用 STICKY_SERVICE 但它不起作用......如果有人能描述我如何做到这一点,请回答这个问题.

适用于android 7.1,不适用于其他版本

这是我的代码...

public class SensorService extends Service {
public int counter=0;

public SensorService(Context applicationContext) {
    super();
    Log.i("HERE", "here I am!");
}

public SensorService() {
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    startTimer();
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.i("EXIT", "ondestroy!");
    stoptimertask();
    Intent broadcastIntent = new Intent("RestartSensor");
    sendBroadcast(broadcastIntent);
}

private Timer timer;
private TimerTask timerTask;
long oldTime=0;
public void startTimer() {
    //set a new Timer
    timer = new Timer();

    //initialize the TimerTask's job
    initializeTimerTask();

    //schedule the timer, to wake up every 1 second
    timer.schedule(timerTask, 1000, 1000); //
}

/**
 * it sets the timer to print the counter every x seconds
 */
public void initializeTimerTask() {
    timerTask = new TimerTask() {
        public void run() {
            Log.i("in timer", "in timer ++++  "+ (counter++));
        }
    };
}

/**
 * not needed
 */
public void stoptimertask() {
    //stop the timer, if it's not already null
    if (timer != null) {
        timer.cancel();
        timer = null;
    }
}

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

这是我的服务重启器...

public class SensorRestarterBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops");
    context.startService(new Intent(context, SensorService.class));
}
}

还有主类

public class MainActivity extends AppCompatActivity {

Intent mServiceIntent;
private SensorService mSensorService;

Context ctx;

public Context getCtx() {
    return ctx;
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ctx = this;
    setContentView(R.layout.activity_main);
    mSensorService = new SensorService(getCtx());
    mServiceIntent = new Intent(getCtx(), mSensorService.getClass());
    if (!isMyServiceRunning(mSensorService.getClass())) {
        startService(mServiceIntent);
    }
}

private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            Log.i ("isMyServiceRunning?", true+"");
            return true;
        }
    }
    Log.i ("isMyServiceRunning?", false+"");
    return false;
}


@Override
protected void onDestroy() {
    stopService(mServiceIntent);

    Log.i("MAINACT", "onDestroy!");
    super.onDestroy();
}
}

这会正确地重新启动服务,但在 3/4 秒后它会死掉。

我已将此添加到我的清单中

<service
        android:name=".SensorService"
        android:enabled="true" >
    </service>

    <receiver
        android:name=".SensorRestarterBroadcastReceiver"
        android:enabled="true"
        android:exported="true"
        android:label="RestartServiceWhenStopped">
        <intent-filter>
            <action android:name="RestartSensor"/>
        </intent-filter>
    </receiver>

【问题讨论】:

  • 你试过什么?显示代码。定义不起作用?正在发生什么,您期望会发生什么?
  • 我可以在另一个问题中发布它吗?
  • @AlesandroGiordano 编辑这个问题
  • 好的,但是我有 3 节课,我必须上传我的清单。我能做到吗?

标签: java android android-intent service android-intentservice


【解决方案1】:

将以下代码添加到您的传感器服务并根据您的需要进行编辑。您需要将粘性服务绑定到通知以保持服务处于活动状态并在前台启动。

@覆盖 公共无效 onCreate() { super.onCreate();

    Intent notifIntent = new Intent(this, SensorService.class);
    PendingIntent pi = PendingIntent.getActivity(this, 0, notifIntent, 0);

    Notification notification = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.smslogo_100x100)
            .setColor(ContextCompat.getColor(this, R.color.colorAccent))
            .setContentTitle(getResources().getString(R.string.app_name))
            .setContentText("Running")
            .setContentIntent(pi)
            .build();
    startForeground(101010, notification);

}

这将解决您面临的问题,并且该服务将永远运行。

【讨论】:

  • 这将防止服务因 Android 操作系统而死 - 不会
  • 但是通知是保持服务存活的必要条件。
  • 您声称添加该权限将防止服务被操作系统杀死。这根本不是真的
  • 编辑了我的答案好友。感谢@TimCastelijns 提供的信息
  • 现在 OP 想要创建一个后台服务,您建议将其设为前台服务。这不是一个真正的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2022-10-18
  • 1970-01-01
相关资源
最近更新 更多