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

Android-从LocationListener.onLocationChanged()调用startActivity(),这真的是我想要的吗?,android,service,start-activity,Android,Service,Start Activity,我正在编写一个前台服务来接收GPS通知、发送系统通知和拨打电话。应用程序没有附加任何活动,只有从启动接收器启动的服务。当我试图从服务的onLocationChanged()内启动调用活动时,我得到: 从活动上下文外部调用startActivity()需要 标志\u活动\u新建\u任务标志。这真的是你想要的吗 由于担心这个怀疑的问题,我决定看看stackOverFlow,在那里我发现了以下内容: ,-所有人都建议做这件事 所以,我的问题是:为什么使用这个标志(关于历史堆栈的东西)是不明智的?对我来

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

从活动上下文外部调用startActivity()需要 标志\u活动\u新建\u任务标志。这真的是你想要的吗

由于担心这个怀疑的问题,我决定看看stackOverFlow,在那里我发现了以下内容: ,-所有人都建议做这件事

所以,我的问题是:为什么使用这个标志(关于历史堆栈的东西)是不明智的?对我来说可以吗

简化代码:

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);
    }

    ...
}

答案完全在于用户体验(UX)领域。Android设备通常是个人设备,在编写应用程序时,你应该记住这一点

用户可能正在玩游戏或打电话,在没有任何通知的情况下启动您的活动是不礼貌的,我会卸载任何这样做的应用程序

此外,如果手机被锁定,您的活动将不会真正启动,而是等待用户解锁手机

另一方面,发出通知是为了告诉用户应用程序想要向您显示某些内容。所以用它们来代替


除非您正在构建一个私人应用程序,否则您就知道什么更适合您的需求。

我会更具体地介绍该应用程序:它意味着每当我驾车前往时,都会使用GPS定位呼叫并打开一扇门。我(和安装这个应用程序的其他人)期待和除了这个粗鲁的行为,当电话自动为我打开大门,即使它在另一个呼叫的中间(新的呼叫不会超过5秒),或者当后座的人在玩游戏时,因为这正是它的意思。我很想知道您是否有解决您提出的问题的方法(我将另行询问)-如何在屏幕锁定时保持服务接收通知并启动呼叫活动。我不确定是否可以通过公共API实现这一点。您可能会寻找黑客,但请不要问,最有可能的问题将被标记为重复。相反,请看这里:Elist,@ M.Me是正确的,当一些东西在他/她的任务中间被干预时,用户会感到麻烦,像这样的干预绝不应该是应用程序的流动。您应该向通知经理发送通知或发出声音和振动等。稍后,通过挂起的意图,您可以开始您的活动