Android - 从LocationListener.onLocationChanged()调用startActivity(),这真的是我想要的吗?

时间:2013-02-25 09:01:07

标签: android service start-activity

我正在编写前台服务来接收GPS通知,发送系统通知和拨打电话。应用程序没有附加Activity,只有从引导接收器启动的服务。当我试图从服务的onLocationChanged()内部启动调用活动时,我得到了:

  

从Activity上下文外部调用startActivity()需要   FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?

由于担心持怀疑态度的问题,我决定查看stackOverFlow,我发现了这些: Calling startActivity() from outside of an Activity contextAndroid: Make phone call from serviceandroid start activity from service - 所有人都建议这样做。

所以,我的问题是:为什么不建议使用这个标志(关于历史堆栈的东西)?在我的情况下可以这样做吗?

简化代码:

public class CallService extends Service implements LocationListener {

    @Override
    public void onCreate() {
        super.onCreate();
        startForeground(1, NotificationGenerator.getNotification());
    }

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

    @Override
    public synchronized void onLocationChanged(Location loc) {
        String url = "tel:xxxxxxxxxx";
        Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(url));
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }

    ...
}

1 个答案:

答案 0 :(得分:2)

答案完全在于用户体验( UX )域。 Android设备通常是个人设备,您应该在编写应用时考虑到这一点。

用户可能正在玩游戏或拨打电话,在没有任何通知的情况下启动您的活动是很粗鲁的,我会卸载任何会这样做的应用。

此外,如果手机被锁定,您的活动将无法实际启动,而是会等到用户解锁手机。

另一方面,通知是告诉用户应用程序想要向您显示某些内容。所以请改用它们。

除非您正在构建私有应用程序,否则您知道什么更符合您的要求。