Android挂起意图问题和全局类

时间:2014-12-16 13:14:52

标签: android global-variables android-pendingintent

所以,我的应用程序有多个活动。

其中一个显示消息列表(从本地SQLite中检索)。

我还有一个扩展Application的GlobalClass,我使用它来在活动之间存储一些值。 像这样:

import android.app.Application;

public class GlobalClass extends Application {
private String uzid;
...
public String getUzer() {
    return uzid;
}

public void setUzer(String aUzer) {
    uzid = aUzer;
}

我的应用程序当然有一个登录页面,用户在获得对应用程序的访问权限之前对其进行身份验证。当他这样做时,我在我的GlobalClass中设置了一个userId整数,其中包含已登录用户的id号。 到现在为止,没什么特别的。

我还有一个同步适配器,用于检查远程服务器上的新消息并同步2个表(本地和远程)。当同步适配器在远程服务器上找到新消息时,它会生成Android通知。当用户点击通知时,我的应用程序会打开,带有收件箱的活动会显示所有消息。

我注意到,我的globalClass用户ID有时是空的,即使我启动应用程序时,如果不设置它也无法通过登录活动。 所以应用程序绝对设置了这个globalClass值。

所以我的猜测是,当点击我的android通知,并显示带有消息列表的活动时,不知何故重新初始化了globalClass?!?!?!?!

有没有办法确保不会发生这种情况?

我真的需要我的用户能够使用该应用程序就像从未通过点击通知从通知栏启动它时发生的那样。 我的意思是,用户登录,正在设置GlobalClass userId,然后应用程序继续。一段时间后,它进入暂停,显示关闭,然后新消息到达并显示通知。用户单击它并将我的应用程序带回显示消息的显示,但userId现在为null。 为什么? 以及如何防止这种情况?

这是我在syncAdapter中找到新消息时显示通知的方式:

        Intent intent = new Intent(context, MesajeActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(context, i, intent, PendingIntent.FLAG_UPDATE_CURRENT); //(context, 0, intent, 0);
        // Build notification
        Notification noti = new Notification.Builder(context)
                .setContentTitle("Message from "+ self.getSursanume())
                .setContentText(self.getTitlu()).setSmallIcon(R.drawable.new_50)
                .setContentIntent(pIntent)
                .build();
        NotificationManager notificationManager;
        notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
        // hide the notification after its selected
        noti.flags |= Notification.FLAG_AUTO_CANCEL;
        noti.defaults |= Notification.DEFAULT_VIBRATE;
        noti.sound = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.htc4);
        noti.number = i;
        notificationManager.notify(i, noti);

这里有什么问题? 我使用当前用户ID(在GlobalClass中找到)来标识当前用户的消息,因此在onCreate和onResume中我实例化我的GlobalClass并检索userID。但这会崩溃我的应用程序。因为有时从通知进入应用程序时,我的全局变量“userID”为NULL。

如何解决此问题?

谢谢

1 个答案:

答案 0 :(得分:1)

  

我注意到,我的globalClass用户ID有时是空的,即使我启动应用程序时,如果不设置它也无法通过登录活动。所以应用程序绝对设置了这个globalClass值。

首先,您的应用可能无法启动活动(例如,应用开始向服务发送命令)。

其次,您的应用可能无法启动您的登录活动(例如,用户从最近任务列表返回给您)。

  

所以我的猜测是,当点击我的android通知,并显示带有消息列表的活动时,不知何故重新初始化了globalClass?!?!?!?!

您的流程在调用之间终止。这是perfectly normal

  

有没有办法确保不会发生这种情况?

不是真的。由于各种原因(例如,崩溃,用户手动终止),进程在所有操作系统上一直消失。

  

我真的需要我的用户能够使用该应用程序,就像从通知栏中点击通知启动它时从未发生过那样。

然后您将需要保留您的数据。静态数据成员(包括自定义Application个对象)仅缓存

或者,不是拥有“登录活动”,而是让它成为某种片段,您可以在需要身份验证时在任何活动中显示这些片段。

或者,让您的Notification路由到“登录活动”,这将确定不需要身份验证,并将用户转发到最终目的地。如果需要OTOH身份验证,“登录活动”会处理此问题,然后会将用户转发到最终目的地。