- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到了一个问题,即使我持有唤醒锁并且调用了 startForeground,我的服务还是被终止了。当平板电脑 (ASUS Transformer TF101) 发生这种情况时,停止服务而不调用 onDestroy。没有其他可见的应用程序,log cat 没有显示任何异常(没有“内存不足”消息等)。服务被杀死后立即重启。
我正在开发的应用程序是一个聊天客户端,需要持续连接,它也是基于插件的,所以我的应用程序是这样开发的:客户端 - 主机服务 - 多个子“服务”。
粘性主机服务持有唤醒锁并调用 startForeground(并显示通知),子服务不粘性,不持有唤醒锁并且是后台服务。
如果客户端本身是打开的,问题就不会发生,但我要使用的模型是用户可以使用设备并保持连接(接收消息等),而无需客户端本身始终处于打开状态。
任何人都可以解释为什么服务会以这种方式被杀死,如果是的话,可以阻止它发生吗?正如聊天客户端在用户登录和注销时显示的那样,服务终止会终止所有打开的连接,这会使聊天客户端“弹跳”。目前,它似乎每 15 到 45 分钟发生一次。
此外,如果有人知道有一种方法可以在整个连接期间保持套接字连接持续打开而无需持有唤醒锁,我很想听听!
主机服务源的修剪测试用例版本如下。
public class HostService extends Service
{
PowerManager m_powerManager = null;
PowerManager.WakeLock m_wakeLock = null;
@Override
public IBinder onBind( Intent intent )
{
return m_serviceImplementation;
}
@Override
public void onCreate()
{
super.onCreate();
}
@Override
public void onDestroy()
{
if( m_wakeLock != null )
{
m_wakeLock.release();
m_wakeLock = null;
}
stopForeground( true );
super.onDestroy();
}
@Override
public int onStartCommand( Intent intent, int flags, int startId )
{
// Display a notification about us starting. We put an icon in the
// status bar.
Notification notification = createNotification();
startForeground( R.string.service_running, notification );
if( m_powerManager == null )
{
m_powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
}
if( m_wakeLock == null )
{
m_wakeLock = m_powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Keep background services running");
m_wakeLock.acquire();
}
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
/**
* Create a notification to show the service is running
*/
private Notification createNotification()
{
CharSequence text = getText( R.string.service_running );
CharSequence title = getText( R.string.app_name );
// The PendingIntent to launch our activity if the user selects this
// notification
PendingIntent contentIntent = PendingIntent.getActivity( this, 0, new Intent(this, MainChat.class) , 0 );
Notification notification = new Notification( android.R.drawable.sym_action_chat, title, System.currentTimeMillis() );
notification.setLatestEventInfo( this, title, text, contentIntent );
return notification;
}
private final IMessageInterface.Stub m_serviceImplementation = new IMessageInterface.Stub()
{
...
};
}
Android list (相关位):
<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="11" />
<service android:name="com.mydomain.chatClient.server.HostService" android:exported="true" android:enabled="true" android:process=":remote"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
最佳答案
I am having a problem where my service is being killed even though I am holding a wake lock and I have called startForeground.
startForeground()
降低了服务被杀死的可能性,但并不能阻止它。
The app I am developing is a chat client and needs a constant connection, it is also plugin based, so my app is developed as such: Client - HostService - Multiple child 'Services'.
我建议去掉其中一层。即使操作系统没有关闭您,许多用户也会(例如,任务 killer 、设置中的运行服务)认为您运行了太多服务。
If the client itself is open the issue does not occur, but the model I am going for is that the user can use the device and stay connected (receiving messages etc) without having the client itself open at all times.
我建议将其设为可选。你可能认为它很性感。您的一些用户会攻击您,因为您浪费了他们的电池。
Can anybody offer any explanation as to why the service is being killed in this way, and if so prevent it from happening?
我将从摆脱 android:process=":remote"
开始.你不需要它。你不想要它。你可能会因为拥有它而伤害自己,因为它可能会加速 Android 摆脱你的服务的兴趣。你拥有它绝对是在伤害用户,因为你在无缘无故地浪费 RAM。
然后,如果您将这些插件实现为单独的应用程序,我将摆脱这些插件。在那种情况下,它们中的每一个都将在其自己的进程中运行,从而浪费更多的 RAM。此外,您当前的实现会有缺陷,因为您将无法将服务命名为 com.mydomain.chatClient.server.HostService
。直到时间结束,因为你没有使用 <intent-filter>
将“服务在内部命名的内容”和“其他希望使用它的单独安装的应用程序调用的服务”的关注点分开。如果您没有将插件实现为单独的应用程序,那么我看不到将它们放在单独的服务中而不是将它们全部折叠到一个服务中的值(value)。
Also, if anybody is aware of a way to keep a socket connection open continuously without holding a wake lock for the entire connection duration, I would love to hear it!
如果套接字是无线数据而不是 WiFi,则不需要 WakeLock
每时每刻。套接字将保持打开状态,该套接字上的传入数据包将唤醒您的代码。在这一点上,你想要捕获一个 WakeLock
足够长的时间让你在数据到达时做任何你正在做的事情,然后释放 WakeLock
.
但是,如果您使用的是 WiFi,这个技巧就不起作用,所以 WakeLock
(可能需要一个 WifiLock
)。
关于java - 持有唤醒锁并调用 startForeground 后服务被终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6317696/
一、公平锁和非公平锁 1.1、公平锁和非公平锁的概述 公平锁:指多个线程按照申请锁的顺序来获取锁。 非公平锁:指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁
阅读目录 1、简介 2、分类 3、全局锁 4、表级锁 5、表锁 6、元数据锁
因此,在我编写的程序中,我有三个函数,为了简单起见,我们将它们称为 A、B 和 C。每个函数都需要访问资源X才能工作。 限制是A和B不允许同时运行并且必须适当同步。但是,C 可以与 A 或 B 同时运
我听说过这些与并发编程相关的词,但是锁、互斥量和信号量之间有什么区别? 最佳答案 锁只允许一个线程进入被锁定的部分,并且该锁不与任何其他进程共享。 互斥锁与锁相同,但它可以是系统范围的(由多个进程共享
这个问题已经有答案了: What is an efficient way to implement a singleton pattern in Java? [closed] (29 个回答) 已关闭
这个问题已经有答案了: What is an efficient way to implement a singleton pattern in Java? [closed] (29 个回答) 已关闭
我对标题中的主题有几个问题。首先,假设我们使用 JDBC,并且有 2 个事务 T1 和 T2。在 T1 中,我们在一个特定的行上执行 select 语句。然后我们对该行执行更新。在事务 T2 中,我们
我希望我的函数只运行一次。这意味着如果多个线程同时调用它,该函数将阻塞所有线程,只允许它运行。 最佳答案 听起来您希望存储过程进行同步。为什么不直接将同步放在应用程序本身中。 pthread_mute
if (runInDemoMode) { lock (this) { //Initalization of tables dCreator.create
我相信无论使用什么语言都可以考虑我的问题,但是为了有一些“ anchor ”,我将使用 Java 语言来描述它。 让我们考虑以下场景:我有一个扩展 Thread 的类 PickyHost 及其实例 p
我知道异步不是并行的,但我现在遇到了一个非常有趣的情况。 async function magic(){ /* some processing here */ await async () =
我们正在使用 Scala、Play 框架和 MongoDB(以 ReactiveMongo 作为我们的驱动程序)构建一个网络应用程序。应用程序架构是端到端的非阻塞。 在我们代码的某些部分,我们需要访问
我需要一个简单的锁,JavaME 超时(concurrent.lock 的反向移植需要完整的 Java 1.3)。 如果其他人已经为 JavaME 发布了经过测试的锁定代码,我宁愿使用它。 锁定是出了
根据 boost : To access the object, a weak_ptr can be converted to a shared_ptr using the shared_ptr co
关于 Mutex 和 Critical 部分之间的区别存在一个问题,但它也不处理 Locks。 所以我想知道临界区是否可以用于进程之间的线程同步。 还有信号状态和非信号状态的含义 最佳答案 在 Win
锁 最为常见的应用就是 高并发的情况下,库存的控制。本次只做简单的单机锁介绍。 直接看代码: 每请求一次库存-1. 假如库存1000,在1000个人请求之后,库存将变为0。
线程和进程 1、线程共享创建它的进程的地址空间,进程有自己的地址空间 2、线程可以访问进程所有的数据,线程可以相互访问 3、线程之间的数据是独立的 4、子进程复制线程的数据 5、子进程启动
**摘要:**细心的你也一定关注到,有的网址是https开头的,有的是http。https开头的网站前面,会有一把小锁。这是为什么呢? 本文分享自华为云社区《还不知道SSL证书已经是刚需了?赶快来了解
试图在 C 中实现一个非常简单的互斥锁(锁)我有点困惑。我知道互斥锁类似于二进制信号量,除了互斥锁还强制执行释放锁的线程的约束,必须是最近获得它的同一线程。我对如何跟踪所有权感到困惑? 这是我到目前为
在阅读了很多与上述主题相关的文章和答案之后,我仍然想知道 SQL Server 数据库引擎在以下示例中是如何工作的: 假设我们有一个名为 t3 的表: create table t3 (a int ,
我是一名优秀的程序员,十分优秀!