代码之家  ›  专栏  ›  技术社区  ›  NPike

仅仅注册一个服务是一个好主意吗?

  •  2
  • NPike  · 技术社区  · 16 年前

    我有一个应用程序,可以监听屏幕关闭和用户显示意图。由于您无法注册以接收来自清单的屏蔽意图,因此我正在服务中注册它们。

    我真的需要有一个完整的服务,以确保我总是得到通知时,屏幕关闭,用户解锁电话?似乎真的很浪费:-(

    我在服务中使用的代码:

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "Service created.");
        // register receiver that handles user unlock and screen off logic
        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_PRESENT);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        BroadcastReceiver mReceiver = new ScreenReceiver();
        registerReceiver(mReceiver, filter); 
    }
    
    5 回复  |  直到 16 年前
        1
  •  1
  •   hackbod    16 年前

    是的,监视事件的唯一方法是主动注册。这是非常有意的,因为对于应用程序来说,这是一件非常诱人的事情,让它们认为自己想被告知,而最终用户每次打开或关闭屏幕时都要启动一堆应用程序,这将导致非常糟糕的用户体验。

    鉴于此,我现在可以告诉你,你不可能做到 保证 除了使用始终运行的服务之外,您还将看到这些事件 和 已使用startForeground()防止其自身被杀死。显然,这不是你想做的事情,除非你的应用程序正在做一些用户非常在意的事情,当他们决定应该为他们运行。

        2
  •  2
  •   Falmarri    16 年前

    您可以使用广播接收器类。广播接收器可以是应用程序的独立部分。

        3
  •  2
  •   shunty    15 年前

        4
  •  0
  •   CommonsWare    16 年前

    因为你不能注册从清单接收屏蔽意图

    你确定吗?文件中没有描述这一限制,但它是针对 ACTION_BATTERY_CHANGED ACTION_CONFIGURATION_CHANGED ACTION_TIME_TICK .

    BroadcastReceiver 如果可能的话。

        5
  •  0
  •   cmcromance    10 年前

    这是一些核心的android代码。

    mUserPresentIntent = new Intent(Intent.ACTION_USER_PRESENT);
    mUserPresentIntent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
     | Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
    

    和

    mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON);
    mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
    mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF);
    mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);