执行onTaskRemoved后应用程序崩溃

时间:2018-01-22 19:21:58

标签: java android android-intent crash

我编辑了这个问题,所以它不重复  this

在MainActivity中我正在做一些文件操作。这些操作在单个文件中处理。所以,之后我通过ForceShut的意图传递文件。这是因为我想检测用户何时从最近的应用程序中刷出应用程序,也就是说调用onTaskRemoved(),该文件将被删除。到目前为止没有问题。该文件通过意图成功传输,并且从日志中调用onTaskRemoved()。当我滑动应用程序时,我尝试在onTaskRemoved()中删除的文件被成功删除,并且其中的日志都运行良好,直到"应用程序终止"显示。但几秒钟之后,我收到一个崩溃警报,说应用程序甚至从最近删除时已停止。虽然崩溃连续出现两次,但没有进一步出现崩溃。可能是什么问题呢 ? :(

我的MainActivity类看起来像这样

public MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //several file operations go here <--
    //removed for simplification 
    Intent mIntent = new Intent(this, ForceShut.class);
     mIntent.putExtra("file", file);
    startService(mIntent);
}
}

和ForceShut类看起来像这样:

public class ForceShut extends Service {
     File file;

     @Nullable
     @Override
     public IBinder onBind(Intent intent) {
         return null;
     }

     @Override
     public int onStartCommand(Intent intent, int flags, int startId){
         file =(File) intent.getExtras().get("file");
         return START_STICKY;
     }

     @Override
     public void onTaskRemoved(Intent rootIntent){
         if(file.exists())
             file.delete();
     }
}

编辑

因为@CommonsWare建议我忘记查看LogCat,而只是看着&#34; Run&#34;选项卡日志。所以我仔细查看了它,似乎有一个空指针异常:     引起:java.lang.NullPointerException:尝试调用虚方法&#39; android.os.Bundle android.content.Intent.getExtras()&#39;在null对象引用上,所以看起来甚至在刷新onStartCommand后再次调用。为什么即使在刷新应用程序后服务也会重新开始?

编辑2 问题不是重复,正如@Andreas指出的那样。我编辑了这个问题。但是我自己找到了解决方法。我使用stopSelf()关闭服务,因为它似乎从最近的应用程序中刷出应用程序并没有摆脱偶尔重新启动的服务。无论如何希望这有助于任何人

2 个答案:

答案 0 :(得分:0)

  

为什么即使在刷新应用程序后服务也会重新开始?

您已启动“粘性”服务。 The system will automatically restart any sticky service until it is explicitly stopped.

 @Override
 public int onStartCommand(Intent intent, int flags, int startId){
     file =(File) intent.getExtras().get("file");
     return START_STICKY;
 }

我看不到你用stopSelf()实际阻止它的位置。

就你的NullPointerExceptions而言,只需在尝试从中读取对象之前检查对象是否存在。

if (intent != null && intent.hasExtra("file"))
    file =(File) intent.getExtras().get("file");

答案 1 :(得分:0)

由于START_STICKY内的onStartCommand,服务重新启动。

您需要使用START_NOT_STICKY来阻止服务重新启动。