Android:某些时间服务在某些应用程序中停止

时间:2014-03-14 13:21:05

标签: java android service

现在我正在使用Android服务。我使文件夹观察者服务。所以当文件夹中的任何移动都会产生。

这是代码:

    @Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();                                               
    Log.v(TAG, "oncreate"); 
    Log.e(TAG, "onStart");

}   

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    Log.v(TAG, "onStart");

    pathToWatch = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() +"/Screenshots/";                

            observer = new FileObserver(pathToWatch) {
                @Override                         
                public void onEvent(int event, final String file) {

                    if(event == FileObserver.CREATE)
                    {
                        String Path= pathToWatch+file;
                        Intent intent = new Intent();                                       
                        intent.setAction(MY_ACTION);                                                                    
                        intent.putExtra("DATAPASSED", Path);
                        sendBroadcast(intent);
                    }
                    else
                    {
                        //Log.d(TAG, "File Else [" + pathToWatch + file + "]");
                    }              
                }           
            };                     
            observer.startWatching();   


    return Service.START_STICKY;
    }

我的问题是:

  1. 当第一次启动应用程序时,它不能正常工作但第二次午餐应用程序正常工作。

  2. 一段时间后我的服务会自动停止,所以我的要求是服务很长时间没有自动停止。

  3. 任何人都知道我的问题?

    提前谢谢你......

2 个答案:

答案 0 :(得分:2)

Android操作系统可以免费杀死任何服务,具体取决于运行更重要的内容(系统进程,前台应用程序,可见服务),请参阅http://developer.android.com/reference/android/app/Service.html

  

请注意,这意味着您的服务大部分时间都在运行   如果它受到严重的记忆压力,就会被系统杀死。如果这   发生这种情况,系统稍后会尝试重启服务。一个   这样做的重要后果是,如果你实施   onStartCommand()用于安排异步或异步完成的工作   另一个线程,那么你可能想要使用START_FLAG_REDELIVERY   系统会为您重新提供一个Intent,以便它不会丢失   如果您的服务在处理过程中被终止。

     

...

     

启动的服务可以使用startForeground(int,Notification)API   将服务置于系统考虑的前台状态   它是用户积极意识到的东西,因此不是   当内存不足时被杀的候选人。 (理论上还是如此   可能会在极端记忆压力下杀死该服务   从当前的前台应用程序,但在实践中这应该   不要担心。)

所以解决方案很明确,

  1. 致电startForeground()
  2. 使用START_FLAG_REDELIVERY
  3. 将您的服务设计为健壮

    编辑: 这是使用startForeground()的一个例子:

    Intent i = new Intent(this, MainActivity.class);
    startForeground(
            NOTIF_MONITORING,
            new NotificationCompat.Builder(getApplicationContext())
                    .setSmallIcon(R.drawable.ic_notification,
                            Notification.PRIORITY_DEFAULT)
                    .setLargeIcon(
                            BitmapFactory.decodeResource(getResources(),
                                    R.drawable.ic_launcher))
                    .setOngoing(true)
                    .setTicker(getString(R.string.notif_ticker))
                    .setContentTitle(getString(R.string.app_name))
                    .setContentText(info)
                    .setContentIntent(
                            PendingIntent.getActivity(this, 0, i, 0))
                    .build());
    

    请注意,这会导致在通知中显示持久通知,这是自4.0以来的必需,以防止恶意应用在后台悄悄运行。如果您发现此要求不受欢迎,则必须使用START_FLAG_REDELIVERY路线。

答案 1 :(得分:0)

你必须在你的服务中使用startForeground(),以便我们可以防止由于内存不足而导致的服务或者来自android平台的任何配置。

例如,

        Notification notification = new Notification.Builder(this)
            .setContentTitle("TOPAZ-PACS")
            .setContentText("")
            .setSmallIcon(com.emdsys.android.pacs.R.drawable.ic_launcher)
            .build();
      notification.flags = Notification.FLAG_ONGOING_EVENT;
      startForeground(1234, notification);

在服务类的oncreate()中。