【问题标题】:Android Studio - Using Service to call final() vs. FLAG_ACTIVITY_NEW_TASKAndroid Studio - 使用服务调用 final() 与 FLAG_ACTIVITY_NEW_TASK
【发布时间】:2017-12-28 05:05:26
【问题描述】:

我已经搜索了一段时间,但找不到任何信息来调用 final() 使用启动的服务......或者更确切地说,当不使用绑定服务时。绑定服务有大量信息,但我已经有两个相当大的“已启动服务”没有绑定,所以我不想修改现有服务而不是绝对必要的。

我的应用通过每 10 秒读取一次蓝牙数据来工作,并且根据读取的数据,服务将更改为新的活动。但是,我无法从我的服务中调用 final(),所以我担心在应用程序/服务运行时我可能会无休止地堆叠活动。

要更改活动,我必须添加 Intent.FLAG_ACTIVITY_NEW_TASK。考虑到开发人员页面中的以下图像/定义,这个标志看起来可能已经处理了我的堆叠问题?我不允许用户使用手机上的后退按钮,因为一切都是通过确认/取消按钮和服务处理的。我的应用程序必须是这种方式有几个原因。因此,保持堆栈顺序对我的应用程序并不重要。

关键点 -

  • 我想确保在开始新活动时不会无休止地堆积活动
  • 通过我的服务启动活动时标记“新任务”
  • 堆栈顺序对我的应用并不重要

下面是我使用 cmets 的一小段代码,用于解释我想要做什么。请务必查看此服务的 onDestroy() 方法。

public class AlertService extends Service {

    final class Threader implements Runnable{
        // Scans bluetooth advertisement packets every 10 seconds
        // Thread Runs until interrupted
        // Stops service via service ID
        stopSelf(this.serviceID);
    }

    @Override
    public void onCreate(){
        super.onCreate();
    }

    // Runs a thread until alert is found. 
    //    Alert calls thread.interrupt()
    @Override
    public int onStartCommand(Intent intent, int flags, int startID){
        enableBluetooth();

        // Start Thread
        thread = new Thread(new Threader(startID));
        thread.start();

        return START_STICKY;
    }

    @Override
    public void onDestroy(){
        thread.interrupt();
        Intent alertActivity = new Intent(this, AlertActivity.class)
        alertActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(alertActivity);
    }

   // Unused Method - We will not be binding
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

EDIT 通过推荐使用 android:taskAffinity - 在这种情况下,使用 android:taskAffinity 对我没有帮助。默认情况下,应用程序中的所有活动都具有相同的亲和性。当我通过在意图标志中设置 Intent.FLAG_ACTIVITY_NEW_TASK 来创建新任务时,如果该活动与任务中的根活动具有相同的 taskAffinity,则新活动仍将在同一任务中启动。由于我只是使用默认的亲和力,所以一切都应该有正常的堆栈流。我就是不能调用finish(),这意味着我正在堆积大量的活​​动。

【问题讨论】:

  • 您是否总是希望后堆栈上只有一个 AlertActivity?
  • @Sunhee 该应用程序以“家庭服务”运行开始。当发现警报时,Home Service 将停止并创建新活动,同时启动“Alert Service”。但是,警报服务期间可能会创建许多活动。通常,警报屏幕会发出警报,但会创建一个新活动以提供定期更新。稍后,一条“all clear”消息通过,结束警报服务并重新启动家庭服务和家庭活动。
  • 如果你只想启动一个 AlertActivity,你必须在 Manifest.xml 中设置 android:taskAffinity 和 android:excludeFromRecents 为 AlertActivity。 但是,请告诉我你的来源,Home Service 停止后创建的活动来源和 AlertActivity 来源?
  • 只是为了确定,你想在home服务停止后启动下一个activity的来源,以及alert服务的来源?我可以以某种方式将这些信息发给您吗,这是与工作有关的。
  • 是的,我想在 home 服务和 AlertActivity 源之后检查活动源。 PM是什么意思?

标签: java android android-studio android-activity service


【解决方案1】:

为了回答我自己的问题,通过 Intent.FLAG_ACTIVITY_NEW_TASK 调用的每个新活动都会为每个活动创建一个新实例并将其放入堆栈。这是真实的。但是,每个活动都不会创建一个新任务,这也是我的恐惧之一。

当我通过在意图标志中设置 Intent.FLAG_ACTIVITY_NEW_TASK 来创建新任务时,如果新活动具有与根活动相同的 taskAffinity任务。因为我只是使用默认的亲和力,所以我创建的每个活动都被放入同一个任务中。这意味着没有什么与创建活动等的正常流程有任何不同。

尽管如此,由于我已禁用应用程序的后退按钮,因此通过标记新任务创建的这些活动并未完成、销毁或从堆栈中删除。为了解决这个问题,我将使用 FLAG_ACTIVITY_CLEAR_TOP,它在堆栈中找到一个正在运行的活动实例(如果有的话)并关闭它上面的所有活动。

由于我的应用程序总是从主屏幕开始,然后以主屏幕结束,标记“清除顶部”将始终关闭我主屏幕上方的所有活动。因此,返回主屏幕后,堆栈中的唯一项目将是主屏幕。

我将不得不对此进行测试,但似乎我不会从我的 home Activity 调用 finish() 来实现这个结果 - 否则,在返回 home Activity 时,并不是所有的堆栈都会被清除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2019-03-06
    相关资源
    最近更新 更多