我在onStartCommand中用一个Timer每隔5秒钟扫描一下相册,有新的照片就copy到其他地方。
请问谁能帮小弟看看哪里有问题啊?
问题不是每次都发生,一般是运行时间比较久之后会发生。
我用下面的代码查看service在运行就是不起作用!
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if ("an.an.MyService".equals(service.service.getClassName())) {
                return true;
            }
        }-----------   service public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
videoBool = intent.getBooleanExtra("video",true);
imageBool = intent.getBooleanExtra("image",false);
final File f1 = new File(dirStr);
initHashTable();
final File f2 = new File(destDirStr);
if(!f2.exists())
{
try
{
destBool = f2.mkdirs();
}catch(Exception e)
{
}
} else {
destBool = true;
}
timer1.schedule(new TimerTask()
{
@Override
public void run() {
if(imageBool)
{
Cursor c = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
null, selectClause, selectArgs, null);
int id=0;
while(c.moveToNext())
{
id = c.getInt(c.getColumnIndex(MediaStore.Images.Media._ID));
if(!imageVec.contains(id))
{
String str1 = c.getString(c.getColumnIndex(MediaStore.Images.Media.DATA));
String dn = c.getString(c.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
File f1 = new File(str1);
File f2 = new File(destDirStr + dn);
boolean copyB = Utils.copyFile(f1,f2,false);
imageVec.add(id);
Log.i("ccccc",dn);
}
}
}
if(videoBool)
{
Cursor c = getContentResolver().query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 
null, selectClause, selectArgs, null);
int id=0;
while(c.moveToNext())
{
id = c.getInt(c.getColumnIndex(MediaStore.Video.Media._ID));
if(!videoVec.contains(id))
{
String str1 = c.getString(c.getColumnIndex(MediaStore.Video.Media.DATA));
String dn = c.getString(c.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME));
File f1 = new File(str1);
File f2 = new File(destDirStr + dn);
boolean copyB = Utils.copyFile(f1,f2,false);
videoVec.add(id);
Log.i("ccccc",dn);
}
}
}
}
}, 0, 5000);


return super.onStartCommand(intent, flags, startId);
}

解决方案 »

  1.   

    有可能service是被系统干掉了,试试把service的优先级调高,看下是否有效果!
      

  2.   

    也可能是系统休眠了, 你的service停止工作了,,, 上网查查相关资料。。
      

  3.   

    不知道下面这些信息怎么回事。貌似是MediaProvider出问题了。我再调用,所以出问题了?09-29 12:43:35.005: I/BootReceiver(61): Copying /data/tombstones/tombstone_01 to DropBox (SYSTEM_TOMBSTONE)
    09-29 12:43:35.035: D/Zygote(33): Process 257 terminated by signal (11)
    09-29 12:43:35.045: I/iii(334): run
    09-29 12:43:35.055: I/ActivityThread(334): Removing dead content provider: media
    09-29 12:43:35.105: D/dalvikvm(334): GREF has decreased to 999
    09-29 12:43:35.155: D/dalvikvm(334): GREF has decreased to 899
    09-29 12:43:35.195: D/dalvikvm(334): GREF has decreased to 799
    09-29 12:43:35.265: D/dalvikvm(334): GREF has decreased to 699
    09-29 12:43:35.295: D/dalvikvm(334): GREF has decreased to 599
    09-29 12:43:35.335: D/dalvikvm(334): GREF has decreased to 499
    09-29 12:43:35.375: D/dalvikvm(334): GREF has decreased to 399
    09-29 12:43:35.415: D/dalvikvm(334): GREF has decreased to 299
    09-29 12:43:35.485: D/dalvikvm(61): GC_FOR_MALLOC freed 55K, 45% free 4278K/7687K, external 1316K/1828K, paused 432ms
    09-29 12:43:35.485: I/dalvikvm-heap(61): Grow heap (frag case) to 8.079MB for 65553-byte allocation
    09-29 12:43:35.625: D/dalvikvm(61): GREF has decreased to 1099
    09-29 12:43:35.625: D/dalvikvm(61): GC_FOR_MALLOC freed 5K, 45% free 4336K/7815K, external 1316K/1828K, paused 52ms
    09-29 12:43:35.635: I/ActivityManager(61): Process android.process.media (pid 257) has died.
    09-29 12:43:35.635: I/ActivityManager(61): Kill an.an (pid 334): provider com.android.providers.media.MediaProvider in dying process android.process.media
    09-29 12:43:35.664: I/Process(61): Sending signal. PID: 334 SIG: 9
    09-29 12:43:35.815: D/dalvikvm(61): GREF has decreased to 999
    09-29 12:43:35.855: D/dalvikvm(61): GREF has decreased to 899
    09-29 12:43:35.895: D/dalvikvm(61): GC_FOR_MALLOC freed 33K, 43% free 4460K/7815K, external 1316K/1828K, paused 53ms
    09-29 12:43:36.035: D/dalvikvm(61): GREF has decreased to 799
    09-29 12:43:36.075: D/dalvikvm(61): GREF has decreased to 699
    09-29 12:43:36.085: D/dalvikvm(61): GC_FOR_MALLOC freed 98K, 45% free 4405K/7879K, external 1316K/1828K, paused 55ms
    09-29 12:43:36.085: I/dalvikvm-heap(61): Grow heap (frag case) to 8.308MB for 174776-byte allocation
    09-29 12:43:36.115: D/dalvikvm(61): GREF has decreased to 599
    09-29 12:43:36.255: D/dalvikvm(61): GREF has decreased to 499
    09-29 12:43:36.255: D/dalvikvm(61): GC_FOR_MALLOC freed 10K, 44% free 4565K/8071K, external 1316K/1828K, paused 54ms
    09-29 12:43:36.255: I/ActivityManager(61): Process an.an (pid 334) has died.
    09-29 12:43:36.595: D/dalvikvm(61): GC_FOR_MALLOC freed 176K, 45% free 4474K/8071K, external 1316K/1828K, paused 241ms
    09-29 12:43:36.595: I/dalvikvm-heap(61): Grow heap (frag case) to 8.333MB for 131088-byte allocation
    09-29 12:43:36.915: D/dalvikvm(61): GC_FOR_MALLOC freed 1K, 45% free 4601K/8263K, external 1316K/1828K, paused 221ms
    09-29 12:43:36.915: W/ActivityManager(61): Scheduling restart of crashed service an.an/.MyService in 5000ms
    09-29 12:43:37.176: D/dalvikvm(61): GC_FOR_MALLOC freed 65K, 46% free 4536K/8263K, external 1316K/1828K, paused 162ms
    09-29 12:43:37.176: I/dalvikvm-heap(61): Grow heap (frag case) to 8.457MB for 196628-byte allocation
    09-29 12:43:37.455: D/dalvikvm(61): GREF has decreased to 399
    09-29 12:43:37.455: D/dalvikvm(61): GC_FOR_MALLOC freed 2K, 45% free 4726K/8519K, external 1316K/1828K, paused 162ms
    09-29 12:43:41.956: I/ActivityManager(61): Start proc an.an for service an.an/.MyService: pid=360 uid=10049 gids={1015}
    09-29 12:43:55.469: D/SntpClient(61): request time failed: java.net.SocketException: Address family not supported by protocol
      

  4.   

    Service如果你没有进行特殊的配置,那么它一般也就能正常执行20秒左右,
    你应该起一个独立的线程,如果需要你应该起一个独立的进程来包装你的Service。以便它能长期运行。
      

  5.   


    我用timerTask就是一个新线程啊。为什么还要包装一个线程!?
      

  6.   

    1.刷新时间不要太频繁
    2.AndroidManifest.xml是否添加了不允许休眠的权限<uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.DEVICE_POWER" />3.如果你是添加了不允许休眠的权限,那在service中还需要在合适的地方调用下面的方法/**
     * onCreate时,申请设备电源锁
     */
    private void acquireWakeLock() {
    if (null == mWakeLock) {
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
    | PowerManager.ON_AFTER_RELEASE, "myService");
    if (null != mWakeLock) {
    mWakeLock.acquire();
    }
    }
    } /**
     * 释放设备电源锁
     */
    private void releaseWakeLock() {
    if (null != mWakeLock) {
    mWakeLock.release();
    mWakeLock = null;
    }
    }4.我没仔细看你的代码,我的做法是在主界面中启动一个定时器,定时发送一个广播,通过广播去调用service,这样就不需要第二步了。if (flag) {
    Intent intent = new Intent(Main.this, AlamrReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(Main.this, 0, intent,0);
    // 获取全局定时器的服务管理器
    AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
    // 通过该方法指定的任务会一直间隔执行,第三个参数就指定了执行的时间间隔
    // 如果我们想取消的话,请使用:alarmManager.cancel(pendingIntent);
    // 注意,这里的pendingIntent要和setRepeating方法中的一致哦。
    am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),(5 * 60 * 1000), pi);// 重复设置
    flag = false;//设为false,确保只启动一次
    }
      

  7.   

    另外你通过广播去调用service的话,如果service被系统干掉了,它还会重新new一个出来。
      

  8.   

    我将程序属性persist更改为true行不行???
      

  9.   

    应该是系统休眠了的原因吧,timertask在休眠后不是太准的
      

  10.   

    请大家看下面的。不知道为什么会有下面两种情况发生。反正就是进程死了,然后会重启进程。
    我就搞不懂为什么会这样子。(其实问题已经解决了。我将timerTask放在service的onCreate方法中就可以了。系统会重启你服务,但是不会调用onStartCommand方法)
    请大侠帮帮我为什么进程会无故死掉?10-13 11:16:59.425: V/LockPatternKeyguardView(2696): *** dispatchDraw() time: 416494298
    10-13 11:17:00.025: D/UnlockClock(2696): GMT_update mRightNow.getTimeZone().getID() == Asia/Harbin
    10-13 11:17:00.135: V/LockPatternKeyguardView(2696): *** dispatchDraw() time: 416495008
    10-13 11:17:04.300: I/iii(14533): run
    10-13 11:17:06.840: D/dalvikvm(14533): Calling exit(1)
    10-13 11:17:06.880: I/ActivityManager(2696): Process an.an (pid 14533) has died.
    10-13 11:17:06.880: W/ActivityManager(2696): Scheduling restart of crashed service an.an/.MyService in 5000ms
    10-13 11:17:06.890: D/Zygote(2578): Process 14533 exited cleanly (1)
    10-13 11:17:11.900: I/ActivityManager(2696): Start proc an.an for service an.an/.MyService: 
    pid=16166 uid=10150 gids={1015}或者说:--------------------------------------------------------------------
    0-13 09:45:01.820: I/ActivityManager(2696): No longer want com.vlingo.client.samsung (pid 12716): hidden #26
    10-13 09:45:01.820: I/ActivityManager(2696): No longer want an.an (pid 12583): hidden #27
    10-13 09:45:01.875: W/ActivityManager(2696): Scheduling restart of crashed service com.vlingo.client.samsung/com.vlingo.client.userlogging.UALService in 5000ms
    10-13 09:45:01.880: W/ActivityManager(2696): Scheduling restart of crashed service an.an/.MyService in 14996ms

    10-13 09:45:01.995: D/KeyguardViewMediator(2696): handleTimeout
      

  11.   

      以前我也碰到类似问题,可能是系统内存不足导致的杀掉了你这个进程。
      
      可以去网上搜搜如何提高你进程的优先级。例如:可以使用Service的方法 ,startForeground()使其变为前台进程。  理论上来说: super.onStartCommand(intent, flags, startId)的返回值为START_STICKY,关于START_STICKY和START_NO_STICKY 的区别你可以看看这篇帖子:http://topic.csdn.net/u/20120213/21/9841319c-4ab8-4830-84d5-da2b2debf35e.html 。验证下。  我对你的这句:(其实问题已经解决了。我将timerTask放在service的onCreate方法中就可以了。系统会重启你服务,但是不会调用onStartCommand方法)) 有点怀疑 。 
      呵呵 ,希望LZ能提供个正确答案哈。
      

  12.   

    你说对我的怀疑。但是我放倒oncreate中确实就可以了。系统会重启我的服务。放在onstart中重启后根本不起作用。