如何在phonestatelistener中创建android alertdialog?

时间:2012-10-20 00:08:01

标签: android alertdialog builder

代码如下所示:

1)在清单文件中声明新活动。 (AndroidManifest.xml中):

    <activity
        android:name=".ConfirmDialog"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Dialog"
        android:launchMode="singleTask"
        android:screenOrientation="vertical">          
    </activity>

2)创建新的类扩展活动。 (公共类ConfirmDialog扩展Activity)

private static final int DIALOG_YES_NO_MESSAGE = 1;

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_YES_NO_MESSAGE:
        return new AlertDialog.Builder(ConfirmDialog.this)
            .setIconAttribute(android.R.attr.alertDialogIcon)
            .setTitle(R.string.app_name)
            .setMessage(R.string.ask_confirm)
            .setPositiveButton(R.string.ask_confirm_yes, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    dialog.cancel();
                    finish();
                }
            })
            .setNegativeButton(R.string.ask_confirm_no, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    dialog.cancel();
                    finish();
                }
            })
            .create();
    }
    return null;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    showDialog(DIALOG_YES_NO_MESSAGE);
}

3)在phonestatelistener中使用新创建的活动。 (公共类Listener扩展PhoneStateListener)

public void onCallStateChanged(int state, String incomingNumber){

    switch(state){              
        case TelephonyManager.CALL_STATE_OFFHOOK:
            confirmCall();          
        break;
    }

    super.onCallStateChanged(state, incomingNumber);

}   

private void confirmCall(){
    Intent intent = new Intent();
    intent.setComponent(new ComponentName("com.example", "com.example.ConfirmDialog"));
    mContext.startActivity(intent);
}

1 个答案:

答案 0 :(得分:0)

并非所有Context个对象都相同,重复使用它们很危险,因为它可能会导致您看到的错误。根据您的评论,修改后的代码会在Context类中存储来自SherlockFragmentActivity的Config,然后在Activity(以及它正在使用的窗口)可能不存在时使用它了。 Context不是空的,可能用于执行Toast,但进行窗口操作非常危险。

一种解决方案是在您的应用中创建一个仅显示对话框的对话框主题活动。在confirmCall()中,使用startActivity()启动您的活动,然后让活动创建对话框。对于用户,屏幕上将显示一个对话框,而不会运行应用程序,但实际上您的应用程序正在运行,并且可以响应用户在对话框上的是/否选项。一定要使用

new AlertDialog.Builder(this)

以便对话框ContextActivity