Android 服务需要一直运行(永远不要暂停或停止)

我创建了一个服务,并希望始终运行这个服务,直到我的手机重新启动或强制关闭。服务应该在后台运行。

创建服务和启动服务的示例代码:

启动服务:

Intent service = new Intent(getApplicationContext(), MyService.class);
getApplicationContext().startService(service);

服务内容:

public class MyService extends Service {


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO do something useful
HFLAG = true;
//smsHandler.sendEmptyMessageDelayed(DISPLAY_DATA, 1000);
return Service.START_NOT_STICKY;
}


@Override
public IBinder onBind(Intent intent) {
// TODO for communication return IBinder implementation
return null;
}
}

舱单声明:

<service
android:name=".MyService"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
</service>

是否可以在应用程序暂停或其他任何情况下始终运行此服务。 一段时间之后,我的应用程序会暂停,服务也会暂停或停止。 因此,我如何在后台运行这个服务,并始终。

131640 次浏览

为了在自己的流程中启动服务,必须在 xml 声明中指定以下内容。

<service
android:name="WordService"
android:process=":my_process"
android:icon="@drawable/icon"
android:label="@string/service_name"
>
</service>

在这里你可以找到一个很好的教程,这对我很有用

Http://www.vogella.com/articles/androidservices/article.html

希望这个能帮上忙

您可以为服务实现 startForeground,即使它死了,您也可以通过在 startCommand()上使用 START_STICKY来重新启动它。虽然不确定这是否是正确的实现。

“是否有可能在应用程序暂停或其他情况下始终运行此服务?”

是的。

  1. 在 onStartCommand 方法的服务中返回 START _ STICKY。

    public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
    }
    
  2. Start the service in the background using startService(MyService) so that it always stays active regardless of the number of bound clients.

    Intent intent = new Intent(this, PowerMeterService.class);
    startService(intent);
    
  3. Create the binder.

    public class MyBinder extends Binder {
    public MyService getService() {
    return MyService.this;
    }
    }
    
  4. Define a service connection.

    private ServiceConnection m_serviceConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
    m_service = ((MyService.MyBinder)service).getService();
    }
    
    
    public void onServiceDisconnected(ComponentName className) {
    m_service = null;
    }
    };
    
  5. Bind to the service using bindService.

            Intent intent = new Intent(this, MyService.class);
    bindService(intent, m_serviceConnection, BIND_AUTO_CREATE);
    
  6. For your service you may want a notification to launch the appropriate activity once it has been closed.

    private void addNotification() {
    // create the notification
    Notification.Builder m_notificationBuilder = new Notification.Builder(this)
    .setContentTitle(getText(R.string.service_name))
    .setContentText(getResources().getText(R.string.service_status_monitor))
    .setSmallIcon(R.drawable.notification_small_icon);
    
    
    // create the pending intent and add to the notification
    Intent intent = new Intent(this, MyService.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    m_notificationBuilder.setContentIntent(pendingIntent);
    
    
    // send the notification
    m_notificationManager.notify(NOTIFICATION_ID, m_notificationBuilder.build());
    }
    
  7. You need to modify the manifest to launch the activity in single top mode.

              android:launchMode="singleTop"
    
  8. Note that if the system needs the resources and your service is not very active it may be killed. If this is unacceptable bring the service to the foreground using startForeground.

            startForeground(NOTIFICATION_ID, m_notificationBuilder.build());
    

一个简单的解决方案是在系统停止服务时重新启动它。

我发现这个方法的一个非常简单的实现:

如何让 Android 服务不可阻挡

如果你已经有了一个服务,并希望它能一直工作,你需要添加两件事情:

  1. 服务本身:

    public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
    }
    
  2. In the manifest:

    android:launchMode="singleTop"
    

No need to add bind unless you need it in the service.

我找到了一个简单而清晰的方法来保持 Service始终运行。

这个家伙已经解释得很清楚了,并且使用了一个很好的算法。他的方法是在服务即将被终止时发送一个 Broadcast,然后使用它重新启动服务。

你应该看看: http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android

在清单中添加此内容。

      <service
android:name=".YourServiceName"
android:enabled="true"
android:exported="false" />

添加服务类。

public class YourServiceName extends Service {




@Override
public void onCreate() {
super.onCreate();


// Timer task makes your service will repeat after every 20 Sec.
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
// Add your code here.


}


});
}
};
//Starts after 20 sec and will repeat on every 20 sec of time interval.
timer.schedule(doAsynchronousTask, 20000,20000);  // 20 sec timer
(enter your own time)
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO do something useful


return START_STICKY;
}


}

我已经克服了这个问题,我的示例代码如下所示。

在你的主要活动中添加以下一行,这里 BackGroundClass 是服务类。您可以在 新增-> JavaClass中创建这个类(在这个类中,添加需要在后台发生的进程(任务))。为方便起见,首先用通知铃声作为后台处理来表示它们。

 startService(new Intent(this, BackGroundClass .class));

在 BackGroundClass 中,只要包含我的代码,您就可以看到结果。

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.widget.Toast;


public class BackgroundService  extends Service {
private MediaPlayer player;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
player = MediaPlayer.create(this,Settings.System.DEFAULT_RINGTONE_URI);
player.setLooping(true);
player.start();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
player.stop();
}
}

在 AndroidManifest.xml 中,尝试添加以下内容。

<service android:name=".BackgroundService"/>

运行该程序,只需打开应用程序,就可以在后台找到通知警报。甚至,您可以退出应用程序,但仍然可能听到铃声警报,除非和直到如果您关闭应用程序或卸载应用程序。这表示通知警报在后台进程中。像这样,你可以添加一些背景过程。

善意注意: 请不要使用 TOAST 验证,因为它只会运行一次,即使是在后台进程中。

希望能有所帮助... ! !

你不需要广播接收器。如果一个人会采取一些痛苦的复制一个 api (服务连接)从上面的例子,斯蒂芬 Donecker 粘贴到谷歌你会得到这个,https://www.concretepage.com/android/android-local-bound-service-example-with-binder-and-serviceconnection