现在我正在使用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;
}
我的问题是:
当第一次启动应用程序时,它不能正常工作但第二次午餐应用程序正常工作。
一段时间后我的服务会自动停止,所以我的要求是服务很长时间没有自动停止。
任何人都知道我的问题?
提前谢谢你......
答案 0 :(得分:2)
Android操作系统可以免费杀死任何服务,具体取决于运行更重要的内容(系统进程,前台应用程序,可见服务),请参阅http://developer.android.com/reference/android/app/Service.html:
请注意,这意味着您的服务大部分时间都在运行 如果它受到严重的记忆压力,就会被系统杀死。如果这 发生这种情况,系统稍后会尝试重启服务。一个 这样做的重要后果是,如果你实施 onStartCommand()用于安排异步或异步完成的工作 另一个线程,那么你可能想要使用START_FLAG_REDELIVERY 系统会为您重新提供一个Intent,以便它不会丢失 如果您的服务在处理过程中被终止。
...
启动的服务可以使用startForeground(int,Notification)API 将服务置于系统考虑的前台状态 它是用户积极意识到的东西,因此不是 当内存不足时被杀的候选人。 (理论上还是如此 可能会在极端记忆压力下杀死该服务 从当前的前台应用程序,但在实践中这应该 不要担心。)
所以解决方案很明确,
编辑: 这是使用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()中。