Android短信意图与同一个机构和同一个收件人相关

时间:2014-07-03 02:40:50

标签: java android android-intent sms

所以我的Android应用程序检测到位置发生变化,然后通知用户并让他采取行动,拨打号码或发送短信。

短信会发送到已保存的号码,其正文为"I'm at " + fullAddress

private NotificationCompat.Builder buildNormal(CharSequence pTitle,String fullAddress) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(
            this);

    Intent in = new Intent(this,MainActivity.class);
    PendingIntent pMainIntent = PendingIntent.getActivity(this, 0,
            in, 0);

    if(getSavedDataString("gNumber")!=null) 
    {
        String url = getSavedDataString("gNumber");
        Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(url));
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);

        //Intent smsIntent = new Intent(Intent.ACTION_SENDTO,Uri.parse("smsto:" 
        //+ Uri.encode(getSavedDataString("gNumber").substring(4))));
        //intent.setData());
        //startActivity(intent);
        Intent smsIntent = new Intent(Intent.ACTION_VIEW);
        //smsIntent.setType("vnd.android-dir/mms-sms");
        smsIntent.putExtra("address", getSavedDataString("gNumber").substring(4));
        smsIntent.putExtra("sms_body","I'm at " + fullAddress);
        smsIntent.setData(Uri.parse("smsto:" 
        + Uri.encode(getSavedDataString("gNumber").substring(4))));
        PendingIntent psmsIntent = PendingIntent.getActivity(this, 0,
                smsIntent, 0);

        builder.addAction(android.R.drawable.ic_menu_call, "Call", pIntent);
        builder.addAction(android.R.drawable.sym_action_email, "Send SMS", psmsIntent);
    }
    else
    {
        builder.addAction(0, "Choose Guardian", pMainIntent);
    }
    builder.setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL);
    // set the shown date
    builder.setWhen(System.currentTimeMillis());
    // the title of the notification
    builder.setContentTitle(pTitle);
    // set the text for pre API 16 devices
    builder.setContentText(pTitle);
    // set the action for clicking the notification

    builder.setContentIntent(pMainIntent);
    // set the notifications icon
    builder.setSmallIcon(R.drawable.ic_home);
    //builder.setSound(android.)
    // set the small ticker text which runs in the tray for a few seconds
    builder.setTicker("Location Change Alert");
    // set the priority for API 16 devices
    //builder.setVibrate(pattern)
    builder.setPriority(Notification.PRIORITY_DEFAULT);
    return builder;
}

此处显示向用户显示的通知包含2个要调用或发送消息的操作,并将其发送到预先存储的号码gNumber

问题是在我按动作发送短信然后丢弃该消息而不发送它也将其从草稿中删除之后。 然后该应用程序检测到另一个位置更改,因此它发送不同的通知与不同的fullAddress意图仍然卡在同一文本正文!!

我也尝试更改收件人,它也会卡在旧收件人身上。我必须重新启动设备或发送我曾经丢弃的消息。

我也尝试从ACTION_VIEW更改为ACTION_SENDACTION_SENDTO,但都是徒劳。

我想知道是否有一个解决方案,除了完全改变这个意图并使用SMSManager之外,还会卡在同一个机构和收件人身上

请帮助。

1 个答案:

答案 0 :(得分:2)

当您的应用请求PendingIntent时,系统会代表您的应用保留令牌,以执行操作,就好像您的应用实际上正在执行此操作一样。它是以这种方式完成的,因此,即使你的应用程序被杀死,无论接收到什么进程,PendingIntent都可以继续使用它。

创建这些令牌时,会记录某些信息,例如操作,操作等。如果您的应用要求具有相同信息的另一个PendingIntent,则将返回相同的令牌。现在,用于确定它们是相同还是不同的信息 not 包含Intent本身携带的额外内容。因此,当您的应用仅使用不同的Intent个附加内容请求相同的短信操作时,您将一遍又一遍地使用原始附加内容获得相同的令牌,除非您通过了标志以不同的方式表示。

至于标志之间的区别:FLAG_CANCEL_CURRENT"确保只有给定新数据的实体才能启动它。如果此保证不是问题,请考虑FLAG_UPDATE_CURRENT。"在您的情况下,我不认为这是一个问题,因此FLAG_UPDATE_CURRENT应该足够了。如果是一个问题,请使用FLAG_CANCEL_CURRENT

引用的内容直接来自docs here