0

代码如下所示:

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 中使用新创建的活动。(公共类监听器扩展了 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);
}
4

1 回答 1

0

并非所有Context对象都是平等的,重用它们是危险的,因为它可能会导致您看到的错误。根据您的评论,您修改后的代码正在Context您的类中存储一个来自 SherlockFragmentActivity 的Config内容,然后在以后使用它Activity(以及它正在使用的窗口)可能不再存在时使用它。is 不是 null并且Context可能可以用来做 a Toast,但是做窗口操作是非常危险的。

一种解决方案是在您的应用程序中创建一个以对话框为主题的活动,该活动将只显示对话框。在confirmCall()中,使用 启动您的活动startActivity(),然后让活动创建对话框。对用户来说,屏幕上会出现一个对话框,但没有运行应用程序,但实际上您的应用程序正在运行并且可以响应用户在对话框上的是/否选择。请务必使用

new AlertDialog.Builder(this)

所以对话框Context是一个Activity.

于 2012-10-20T17:28:49.853 回答