我有一个相当完整的位置追踪应用程序,但仍存在一个问题。当应用程序启动时,如果跟踪服务当前正在运行,则需要显示第二个活动。
我有两个活动(LoginActivity和MainActivity)和两个服务(LocationService和ReportingService - 运行在它们自己的进程中)。当应用程序正在跟踪位置时,两个服务必须保持活动状态,但MainActivity可以被杀死。LocationService创建一个不可删除的通知,以确保用户知道他们正在被跟踪。当用户点击通知时,它将重新启动/创建MainActivity - intent包含所有相关数据,MainActivity需要访问它们的帐户和资产以及选择了哪些帐户和资产。
然而,如果应用正在跟踪位置并且MainActivity已被杀死,然后用户通过常规启动器图标打开应用,则会进入LoginActivity。根据清单文件定义,LoginActivity是应用程序的典型入口点。
如何在LocationService正在跟踪时,将MainActivity作为备用入口点使用?它应该如何恢复先前的状态数据?
步骤可能需要如下:
1. 当跟踪开始时,MainActivity将Accounts和Assets的DB ID存储在SharedPreferences中。 2. 创建LoginActivity时,请检查LocationService是否正在运行。 3. 如果是,则使用特殊的“从SharedPreferences还原”extra启动MainActivity。 4. MainActivity.onCreate()显示加载对话框并从SharedPreferences获取DB ID。 5. 广播到ReportingService,我们需要获取与DB ID相对应的对象。 6. 监听响应,然后更新UI并取消加载对话框。
如果我需要在LoginActivity的onCreate()中添加一些特殊逻辑以检查运行的服务,然后立即启动MainActivity吗?但是这样做会有另一个问题:MainActivity没有状态数据。如果用户不通过通知打开它,是否有一种方法访问通知的意图?
MainActivity.onSaveInstanceState()将状态数据保存到Bundle中,但我认为在活动被杀死后,它就消失了,对吗?我考虑直接将状态数据保存到SharedPreferences中,但这感觉不好。我的“thing”对象都实现了Parcelable,因此可以将它们放入bundle和intent extras中,但是不能将Parcelable放入SharedPreferences中。我可以通过JSON化它们来绕过此问题,但对象的JSON表示仅用于与RESTful服务器通信,因此它们不包括某些应用程序特定数据。我不喜欢肮脏的技巧,所以我宁愿以正确的方式处理这个问题。
最好的方法是什么?
我有两个活动(LoginActivity和MainActivity)和两个服务(LocationService和ReportingService - 运行在它们自己的进程中)。当应用程序正在跟踪位置时,两个服务必须保持活动状态,但MainActivity可以被杀死。LocationService创建一个不可删除的通知,以确保用户知道他们正在被跟踪。当用户点击通知时,它将重新启动/创建MainActivity - intent包含所有相关数据,MainActivity需要访问它们的帐户和资产以及选择了哪些帐户和资产。
然而,如果应用正在跟踪位置并且MainActivity已被杀死,然后用户通过常规启动器图标打开应用,则会进入LoginActivity。根据清单文件定义,LoginActivity是应用程序的典型入口点。
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
如何在LocationService正在跟踪时,将MainActivity作为备用入口点使用?它应该如何恢复先前的状态数据?
步骤可能需要如下:
1. 当跟踪开始时,MainActivity将Accounts和Assets的DB ID存储在SharedPreferences中。 2. 创建LoginActivity时,请检查LocationService是否正在运行。 3. 如果是,则使用特殊的“从SharedPreferences还原”extra启动MainActivity。 4. MainActivity.onCreate()显示加载对话框并从SharedPreferences获取DB ID。 5. 广播到ReportingService,我们需要获取与DB ID相对应的对象。 6. 监听响应,然后更新UI并取消加载对话框。
如果我需要在LoginActivity的onCreate()中添加一些特殊逻辑以检查运行的服务,然后立即启动MainActivity吗?但是这样做会有另一个问题:MainActivity没有状态数据。如果用户不通过通知打开它,是否有一种方法访问通知的意图?
MainActivity.onSaveInstanceState()将状态数据保存到Bundle中,但我认为在活动被杀死后,它就消失了,对吗?我考虑直接将状态数据保存到SharedPreferences中,但这感觉不好。我的“thing”对象都实现了Parcelable,因此可以将它们放入bundle和intent extras中,但是不能将Parcelable放入SharedPreferences中。我可以通过JSON化它们来绕过此问题,但对象的JSON表示仅用于与RESTful服务器通信,因此它们不包括某些应用程序特定数据。我不喜欢肮脏的技巧,所以我宁愿以正确的方式处理这个问题。
最好的方法是什么?
static
变量在操作系统进程之间共享数据。 - David Wasser