Android服务需要始终运行(从不暂停或停止)

时间:2013-04-02 07:59:44

标签: java android service

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

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

启动服务:

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>

是否可以在应用程序暂停和其他任何操作时始终运行此服务。 一段时间后,我的应用程序暂停,服务也暂停或停止。 那么如何在后台运行此服务并始终如此。

9 个答案:

答案 0 :(得分:86)

“是否可以像应用程序暂停和其他任何事情一样运行此服务?”

  1. 在服务onStartCommand方法中返回START_STICKY。

    public int onStartCommand(Intent intent, int flags, int startId) {
            return START_STICKY;
    }
    
  2. 使用startService(MyService)在后台启动服务,这样无论绑定客户端的数量如何,它始终保持活动状态。

    Intent intent = new Intent(this, PowerMeterService.class);
    startService(intent);
    
  3. 创建活页夹。

    public class MyBinder extends Binder {
            public MyService getService() {
                    return MyService.this;
            }
    }
    
  4. 定义服务连接。

    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. 使用bindService绑定到服务。

            Intent intent = new Intent(this, MyService.class);
            bindService(intent, m_serviceConnection, BIND_AUTO_CREATE);
    
  6. 对于您的服务,您可能需要通知,以便在关闭后启动相应的活动。

    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. 您需要修改清单以单顶模式启动活动。

              android:launchMode="singleTop"
    
  8. 请注意,如果系统需要资源而您的服务不是非常活跃,则可能会被终止。如果这是不可接受的,请使用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)

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

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

How to make android service unstoppable

答案 3 :(得分:2)

您可以为服务实施startForeground,即使它已经死亡,也可以使用START_STICKY上的startCommand()重启服务。不确定这是否是正确的实现。

答案 4 :(得分:1)

如果您已经拥有服务并希望它始终有效,则需要添加两项内容:

  1. 在服务中:

    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
    
  2. 在清单中:

    android:launchMode="singleTop"
    
  3. 除非您在服务中需要,否则无需添加绑定。

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