我创建了一项服务,并希望始终运行此服务,直到我的手机重新启动或强制关闭。该服务应该在后台运行。
已创建服务和启动服务的示例代码:
启动服务:
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>
是否可以在应用程序暂停和其他任何操作时始终运行此服务。 一段时间后,我的应用程序暂停,服务也暂停或停止。 那么如何在后台运行此服务并始终如此。
答案 0 :(得分:86)
“是否可以像应用程序暂停和其他任何事情一样运行此服务?”
是
在服务onStartCommand方法中返回START_STICKY。
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
使用startService(MyService)在后台启动服务,这样无论绑定客户端的数量如何,它始终保持活动状态。
Intent intent = new Intent(this, PowerMeterService.class);
startService(intent);
创建活页夹。
public class MyBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
定义服务连接。
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;
}
};
使用bindService绑定到服务。
Intent intent = new Intent(this, MyService.class);
bindService(intent, m_serviceConnection, BIND_AUTO_CREATE);
对于您的服务,您可能需要通知,以便在关闭后启动相应的活动。
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());
}
您需要修改清单以单顶模式启动活动。
android:launchMode="singleTop"
请注意,如果系统需要资源而您的服务不是非常活跃,则可能会被终止。如果这是不可接受的,请使用startForeground将服务带到前台。
startForeground(NOTIFICATION_ID, m_notificationBuilder.build());
答案 1 :(得分:8)
要在自己的进程中启动服务,必须在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
希望这有帮助
答案 2 :(得分:4)
答案 3 :(得分:2)
您可以为服务实施startForeground
,即使它已经死亡,也可以使用START_STICKY
上的startCommand()
重启服务。不确定这是否是正确的实现。
答案 4 :(得分:1)
如果您已经拥有服务并希望它始终有效,则需要添加两项内容:
在服务中:
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
在清单中:
android:launchMode="singleTop"
除非您在服务中需要,否则无需添加绑定。
答案 5 :(得分:0)
我找到了一种简单明了的方法来始终保持Service
运行。
这家伙已经如此清楚地解释了它,并使用了一个很好的算法。他的方法是在服务即将被杀死时发送广播,然后使用它重新启动服务。
你应该看一下:http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android
答案 6 :(得分:0)
在清单中添加此内容。
<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;
}
}
答案 7 :(得分:0)
我已经克服了这个问题,我的示例代码如下。
在主活动中添加以下行,此处BackGroundClass是服务类。您可以在新建 - >&gt;中创建此类。 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进行验证,因为即使它处于后台进程,它也只会运行一次。
希望它会有所帮助...... !!
答案 8 :(得分:0)
您不需要广播接收器。如果您不愿意花时间复制斯蒂芬·多内克(Stephen Donecker)的示例中的api(serviceconnection)之一,然后将其粘贴到Google中,您将得到https://www.concretepage.com/android/android-local-bound-service-example-with-binder-and-serviceconnection