在列表项上持续Toast单击可启动另一个应用程序



我有一个片段a。。这是一个列表片段,它加载一个联系人列表并显示它们,类似于电话簿的功能。现在,如果我点击一个联系人说"John Doe",该应用程序将启动另一个应用程序(在我的情况下是Sim工具包),并显示带有他的姓名和号码的toast,供用户在使用STK时使用。一旦用户完成使用STK或导航回应用程序,toast就会消失。但在我的情况下,Toast仍然存在,在某些情况下,即使我退出应用程序,Toast也会无限显示。我该如何更正?以下是我的代码的片段

list.setOnItemClickListener(new OnItemClickListener() {
    @SuppressLint("RtlHardcoded")
    @SuppressWarnings("deprecation")
    public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
        @SuppressWarnings("unchecked")
        HashMap<String, String> h = (HashMap<String, String>) list.getAdapter().getItem(position);
        String Name="",Number="";
        Name = h.get(KEY_NAME);
        Number = h.get(KEY_PHONENUMBER);
        toast = Toast.makeText(context, "", Toast.LENGTH_LONG);
        toast.setGravity(Gravity.TOP|Gravity.RIGHT, 0, 0);
        toast.setView(layout);  
        toast.cancel();
        userNameText.setText(Name);
        userNumberText.setText(Number);
        PersistToast();
        getActivity().startService(ServiceIntent);
        try {
            if (!ReceiverON) {
                getActivity().registerReceiver(objReceiver, filter);
                ReceiverON=true;
            }
        } catch (IllegalArgumentException illegalargumentexception) {
            illegalargumentexception.printStackTrace();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

持久Toast方法

private void PersistToast() {
    long delay =  1000;
    long period = 1000; 
    mDoTask = new TimerTask() {
        @Override
        public void run() {                    
            toast.show();
        }
    };
    mT.scheduleAtFixedRate(mDoTask, delay, period);
}

接收器

private class Receiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent arg1) {
        if (!(currentTask().equals("com.android.stk"))){
            try {
                if(toast != null) {
                    toast.cancel();
                    mDoTask.cancel();
                }
            } catch(Exception e) {
            }
        }
    }
}
public String currentTask() {
    return ((android.app.ActivityManager.RunningTaskInfo)((ActivityManager)context.getSystemService("activity")).getRunningTasks(1).get(0)).topActivity.getPackageName().trim();
}

该服务定期对接收器进行ping,以便接收器依次检查前面的当前活动是否为STK,如果不是,则取消toast和计时器任务

这是toast的滥用,它不是为此类任务设计的。从android 4.1开始,用户甚至可以禁用应用程序的通知(这也禁用了应用程序的toast),所以toast是不可靠的,应该只显示可以忽略的附加信息,而不会造成任何伤害。

你的方法是使用叠加活动。请参阅如何在Android 中创建始终处于顶部的全屏覆盖活动

最新更新