应用程序停止时,服务代码停止

时间:2014-10-09 21:38:02

标签: java android service

我有一个应用程序,可以从数据库中获取用户的消息,如果有新消息它会推送通知我使用的服务...当应用程序打开或在前台时服务正常工作..但是当我关闭它它不起作用..它没有被破坏或停止它没有工作:SI不知道为什么..这是我的服务代码:

public class BGService extends Service {

ArrayList<Message> messages = new ArrayList<Message>();
ArrayList<String> requests = new ArrayList<String>();
Timer timer = new Timer();
Timer timer2 = new Timer();

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onDestroy() {
    Log.d("Chat", "BGService Destroyed");
    timer.cancel();
    timer.purge();
    timer2.cancel();
    timer2.purge();
}

@SuppressWarnings("unchecked")
@Override
public void onStart(Intent intent, int startId) {
    Log.d("Chat", "BGService Started");
    messages = (ArrayList<Message>) intent.getExtras().get("messages");
    requests = (ArrayList<String>) intent.getExtras().get("requests");
    Log.d("Button Clicked", "Messages: " + messages);

    new Timer().scheduleAtFixedRate(new TimerTask() {
        public void run() {
            Log.d("Service", "Running");
        }
    }, 2000, 2000);
 }
}

1 个答案:

答案 0 :(得分:0)

您告诉服务停止在您的代码中。因为你使用onBind()它似乎是你没有启动服务而是反过来。如果绑定到服务,则服务会在活动结束时自动结束。

如果您想让服务继续运行。

  • 启动服务以保持服务正常运行
  • 在应用运行时绑定到服务以获得服务
  • 设置通知,使服务位于前台
  • 更改您的清单,以便服务在单独的流程中运行

启动服务,这样你就可以在onStartCommand()中返回startsticky来告诉你想要坚持的操作系统

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

开始服务。仅当您具有与服务来回通信的连接时才绑定到服务。这是从onBind()

返回的
startService(new Intent(context, ServiceLocationRecorder.class));
    // bind to the service
    if (!mIsBound) {
        // Bind to the service
        bindService(new Intent(context,
                ServiceLocationRecorder.class), mConnection,
                Context.BIND_AUTO_CREATE);
        mIsBound = true;
    }

绑定到服务用于设置可与服务进行通信的绑定程序处理程序。在onBind()中返回null会违反onBind()事件的目的,因此您可以跳过此代码。

/**
 * When binding to the service, we return an interface to our messenger for
 * sending messages to the service.
 */
@Override
public IBinder onBind(Intent intent) {
    return mMessenger.getBinder();
}

将服务设置为您执行此操作的前台,并且操作系统不太可能结束您的服务以获取另一个应用程序的内存。

 //this is done inside the service
startForeground(R.id.action_record, getMyCustomNotification());

在自己的流程中运行服务,然后GC将能够收集您的活动并保持服务正常运行。

<service
        android:name="com.example.service"


        android:process=":myseparateprocess" >s -->
    </service>