标签: multitasking

设计iPhone iOS4应用程序行为:在后台运行与终止应用程序

我们正在为汽车司机开发iPhone GPS应用程序.

您可能知道,iOS4引入了多任务处理,因此我们的应用程序可以在后台运行 - 事实就是如此.这是其功能的一部分.

问题在于在iOS4上关闭应用程序的标准方法.以下是两种情况:

1)用户想要将应用程序放到后台:

通常,在iPhone iOS4上,它就像按"主页"按钮一样简单.

2)用户想关闭应用程序(即到达目的地点后):

标准iPhone iOS4程序如下:

  • 按"主页"按钮 - 应用程序进入后台
  • 按两次"主页"按钮 - 显示正在运行的应用程序列表
  • 点击并按住其中一个应用程序图标 - 每个图标上都会显示"摇晃"和" - "符号
  • 点击用户希望终止的应用程序图标上的" - "符号

用户每次到达某处(例如,每天两次)都必须终止我们的申请,以节省他的电池.如果他不这样做 - GPS会很快耗尽所有电池电量.此外,我们无法在后台运行时禁用GPS,因为我们需要主要应用程序功能的精确位置信息.

当然,您无法更改应用程序中"主页"按钮的行为(即可接受AppStore).此外,我认为将预期行为改为与iPhone平台上的其他应用程序完全不同的东西并不是一个好的解决方案.

你觉得怎么样?你知道任何好的解决方案吗?我们有一个想法,但我不想向你提出任何建议.

我们的解决方案非常简单:只需在屏幕右上方显示小的"x"按钮即可.点击它会终止应用程序(可能在一些确认问题之后).

这个解决方案有一个很大的优势:它不会改变默认的系统行为 - 用户意识到iOS4多任务使用仍然可以按下"主页"按钮在后台运行应用程序并以iPhone方式关闭它.

你怎么看?

iphone application-design multitasking ios4

7
推荐指数
2
解决办法
6409
查看次数

如何告诉我的应用程序即将变为非活动状态/进入后台状态?

我假设我需要实现:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                                 selector:@selector(resignActive:)
                                                     name:UIApplicationWillResignActiveNotification
                                                   object:nil];
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否是确定我的应用程序即将离开活动状态的正确通知.

这是取消网络连接以及应用程序终止的好地方吗?

iphone cocoa-touch objective-c nsnotifications multitasking

7
推荐指数
1
解决办法
3979
查看次数

iOS中的NSURLConnection和多任务处理

NSURLConnection用来在iOS中异步下载资源.(它们是大型PDF文件,因此连接速度较慢需要一些时间.)

现在我正在将我的应用程序从iOS 3更新到iOS 4.由于我的应用程序不是位置感知,voip和背景音乐,我想我需要做点什么.

我的问题是,NSURLConnection当前正在运行的是什么?当应用程序回到前台时,它是否被暂停并神奇地恢复,还是被彻底杀死了?如果是后者,那么以后自动恢复它的标准策略是什么?是否有一个NSURLConnection自动执行此操作的开源子类?

cocoa-touch nsurlconnection multitasking ios4

7
推荐指数
1
解决办法
3025
查看次数

如何在后台中断后恢复AVAudioPlayer

我在后台使用AVAudioPlayer播放音乐.问题是:如果有传入呼叫中断播放器,它将永远不会恢复,除非切换到前台并手动执行.

代码很简单,在后台播放:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord  error: nil];
[[AVAudioSession sharedInstance]  setActive: YES error: nil];

url = [[NSURL alloc] initFileURLWithPath:...];

audio_player = [[AVAudioPlayer alloc] initWithContentsOfURL: url error:NULL];
audio_player.delegate = self;
bool ret = [audio_player play];
Run Code Online (Sandbox Code Playgroud)

委托处理中断:

-(void)audioPlayerBeginInterruption:(AVAudioPlayer *)player
{
    //tried this, not working [[AVAudioSession sharedInstance]  setActive: NO error: nil]; 
    NSLog(@"-- interrupted --");
}


//----------- THIS PART NOT WORKING WHEN RUNNING IN BACKGROUND ----------
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player
{
    NSLog(@"resume!");
    //--- tried, not working: [[AVAudioSession sharedInstance] setCategory:             AVAudioSessionCategoryPlayAndRecord  error: nil];
    //--- tried, not …
Run Code Online (Sandbox Code Playgroud)

iphone audio background multitasking ios

7
推荐指数
2
解决办法
7099
查看次数

Task.ContinueWith方法需要任务参数吗?

我有一个有两个方法的类,Load()和Process().我希望能够将这些单独作为后台任务或按顺序运行.我喜欢ContinueWith()语法,但我无法让它工作.我必须在我继续的方法上获取一个Task参数,并且在初始方法上不能有Task参数.

我想在没有lambda表达式的情况下做到这一点,但我是不是使用它们,强制在其中一个方法上创建任务参数,或者创建第三个方法LoadAndProcess()?

void Run()
{
    // doesn't work, but I'd like to do it
    //Task.Factory.StartNew(MethodNoArguments).ContinueWith(MethodNoArguments);

    Console.WriteLine("ContinueWith");
    Task.Factory.StartNew(MethodNoArguments).ContinueWith(MethodWithTaskArgument).Wait();

    Console.WriteLine("Lambda");
    Task.Factory.StartNew(() => { MethodNoArguments(); MethodNoArguments(); }).Wait();

    Console.WriteLine("ContinueWith Lambda");
    Task.Factory.StartNew(MethodNoArguments).ContinueWith(x => { 
            MethodNoArguments(); 
        }).Wait();
}

void MethodNoArguments()
{
    Console.WriteLine("MethodNoArguments()");
}

void MethodWithTaskArgument(Task t = null)
{
    Console.WriteLine("MethodWithTaskArgument()");
}
Run Code Online (Sandbox Code Playgroud)

c# multitasking task-parallel-library

7
推荐指数
2
解决办法
1万
查看次数

合作多任务系统

我试图绕过合作多任务系统的概念,以及它在单线程应用程序中的确切工作方式.

我的理解是,这是一种"多任务处理形式,其中多个任务通过在每个任务内的程序员定义的点上自动将控制权交给其他任务来执行."

因此,如果您有一个任务列表并且一个任务正在执行,那么您如何确定将执行传递给另一个任务?当你将执行恢复到之前的任务时,如何从以前的位置恢复?

我觉得这有点令人困惑,因为我不明白如果没有多线程应用程序可以实现这一点.

任何建议都会很有帮助:)

谢谢

multitasking

7
推荐指数
2
解决办法
6809
查看次数

在后台媒体播放期间响应MPMoviePlayerController通知

我有一个应用程序,它从网络流式传输视频并使用MPMoviePlayerController对象播放它,以便在设备上或通过AirPlay播放.

该应用程序支持后台操作,并UIBackgroundModes在其plist文件中的必需键中列出了"audio"选项.

通过AirPlay播放时,应用程序可以成功推送到后台,视频继续正常播放.到现在为止还挺好.

根据Apple文档:

包括音频键告诉系统框架他们应该继续播放并以适当的间隔对应用程序进行必要的回调.如果应用程序不包含此键,则当应用移动到后台时,应用播放的任何音频都会停止.

但是,这些回调没有进行.

该应用程序使用两种类型的回调:与通知相关联的回调MPMoviePlayerController以及AVPlayer基于计时器的回调,这些回调监视回放位置和性能统计数据以进行监控.

纵观苹果的笔记,我当然希望收到的第一类型的回调,从而使应用程序可以响应MPMoviePlayerPlaybackStateDidChangeNotification,MPMoviePlayerPlaybackDidFinishNotificationMPMoviePlayerLoadStateDidChangeNotification,但这种情况不会发生.

有谁知道在后台AirPlay播放过程中是否可以接收这些,如果有的话,这是如何实现的?

**请注意:该应用程序在前台运行时可以正常工作并收到通知.只有当被推到后台并通过AirPlay播放时才会收到通知.

同样,视频正好在后台播放AirPlay.只收到未收到的通知**

iphone mpmovieplayercontroller multitasking ios avplayer

6
推荐指数
1
解决办法
8235
查看次数

下载时是绑定服务还是自定义线程?

我正在开发一个Android项目,我需要将一些图像加载到GridView.如果缓存丢失,图像可能位于缓存中,然后查询Internet服务器.我的设计是使用两个线程来完成加载任务.一个用于读取缓存的线程和一个用于下载的线程 所以有3个线程,包括UI一个.它们中的每一个都有自己的消息队列,并使用Handler进行通信.

我的问题是我是否应该在这种情况下使用绑定服务?实际上我已经意识到上面的设计并且它似乎没有错,但GC正在努力工作,这可以从logcat推断出来.

另一个问题是当我使用DDMS监视线程时存在多个线程.这是因为在几个活动中使用了相同的加载机制.在调用onPause()时,我让线程退出了它的消息循环,我确信它们中只有两个在同一时间存活.但是我可以在DDMS中看到它们.(顺便说一句,为什么线程仍然存在?我让thread = null;)

总而言之,我的问题是:这个加载任务能否受益于绑定服务?

java service android caching multitasking

6
推荐指数
1
解决办法
111
查看次数

Android中的浮动视频播放器?

我在我的Android应用程序中添加了Vitamio播放器.它工作正常.在Vitamio或任何其他播放器中是否有任何方法,以便我可以让播放器漂浮在其他应用程序上并像这样重新调整大小?

android media-player multitasking http-live-streaming

6
推荐指数
1
解决办法
1244
查看次数

CPU线程、内核线程、操作系统线程、用户线程的区别

我已经阅读了很多关于并行性与并发性有何不同的文章,但我有很多问题,例如如何使用 Java 等编程语言实现并行性?

到目前为止,我所理解的是使用像 Java 这样的 VM 我们只能实现并发性,而并行性不在 JVM 的范围内,它的线程映射到(我在这里很困惑)操作系统线程或内核线程?

要了解多线程,需要了解 VM (JVM) 或进程的线程实际上是如何映射到 CPU 硬件的。请在这里帮忙。

如果我错了,请纠正我,以下是我认为我理解正确的几件事:

1. CPU 线程(英特尔超线程):通过在具有相同 ALU 的 CPU 中添加更多寄存器来提供硬件线程,因此实际上并不表现为双 CPU(如果 CPU 中有 2 个线程)和“只是”并发使用 ALU 可以掩盖(通过交错 MUXing 隐藏)主要无法提供真正的并行代码执行。

2. 内核线程:由内核启动,这些线程的数量可能比 CPU 线程多,但启动起来有点贵。

3. 操作系统线程:我不明白。我猜这就是您在调用本机线程时的意思,并且可能与之前的 #2(即内核线程)相同。

4. 用户线程:就像new Thread()在 JVM 或 .NET 中一样。我认为它们不被操作系统识别为线程,所以从并行性的角度来看,这里没有什么可以做的。

我需要了解 #4 中创建的线程如何映射到 #1,可能是 Windows/Linux/MacOS 的示例。

伙计们,我了解这个问题的范围有多大,但我可以接受简要信息并链接到任何详细文档。提前致谢。

java parallel-processing concurrency multithreading multitasking

6
推荐指数
1
解决办法
2101
查看次数