列表项目上的持久Toast单击启动另一个应用程序

时间:2014-10-16 13:23:36

标签: android toast

我有一个FragmentA ..这是一个列表片段,它加载一个联系人列表并显示它们类似于电话簿的行为。现在,如果我点击一个联系人说" John Doe"该应用程序将启动另一个应用程序(在我的情况下为Sim Tool Kit),并且还显示带有他的姓名和号码的吐司,供用户在使用STK时使用。一旦用户完成使用STK或导航回应用程序,那么吐司应该消失。但在我的情况下,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操作,以便接收方依次检查前面的当前Activity是否为STK,如果不是则取消toast和timer任务

1 个答案:

答案 0 :(得分:0)

这是对吐司的滥用,这不是为此类任务设计的。从Android 4.1用户甚至可以禁用应用程序的通知(这也禁用了应用程序的敬酒) - 所以吐司是不可靠的,应该只显示额外的信息,可以忽略,没有任何伤害。

您的方法是使用叠加活动。见How to create always-top fullscreen overlay activity in Android