在 onClick 中从 AlertDialog 启动服务。有时服务没有启动

Starting service from AlertDialog in onClick. Sometime service is not starting

我已关注 class 以显示来自社交网站的消息:

public class MessageDialog extends DialogFragment {

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    final LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.message_dialog, null);

    builder.setView(view)
            .setNeutralButton("Send", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(getActivity().getApplicationContext(), RequestService.class);
                    //intent.putExtra("data", some_extra_data);
                    getActivity().startService(intent);
                }
            })
            .setPositiveButton("GoTo", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    //GoTo();
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }
            });

    return builder.create();
}

@Override
public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    if(getActivity() != null)
    getActivity().finish();
}

}

上面的class当然是简化了的。此消息从 FragmentActivity 显示从后台服务启动。 我发现在某些情况下 AlertDialog(消息对话框)的按钮不会在 onClick 中执行代码。例如,服务 RequestService.class 不是仅在第二天开始,而是第一次开始。再次显示对话框后,它工作正常。

FragmentActivity class AlertDialog 显示的位置:

public class MyFragmentDialog extends FragmentActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    FragmentManager fm = getSupportFragmentManager();

    Intent intent = getIntent();
    Bundle extras = intent.getExtras();

    switch (extras.getInt("action", 0))
    {
        case SHOW_MSG_DIALOG:
            // 1. Message case
            String json = extras.getString("data");

            if(json != null)
            {
                try {
                    JSONObject mail = new JSONObject(json);

                    MessageDialog msgDialog = new MessageDialog();
                    msgDialog.setData(mail);
                    msgDialog.show(fm, "msgDialog");

                } catch (JSONException e) {
                    e.printStackTrace();
                    finish();
                }
            }
            else
            finish();

        break;

        // 2. case
        // ...

        // 3. case
        // ...

        case 0:
            // exit default
        break;
    }

}
}

我是不是漏了什么?

已解决: AppCompatEditText 中的错误破坏了我的 json 字符串。 Android...一件衬衫的和平)

试试这个,

在对话框片段中创建构造函数。

public class MessageDialog extends DialogFragment {

  private Activity mActivity;
     public MessageDialog(Activity mActivity) {
            this.mActivity = mActivity;

        }

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
    final LayoutInflater inflater = mActivity.getLayoutInflater();
    View view = inflater.inflate(R.layout.message_dialog, null);

    builder.setView(view)
            .setNeutralButton("Send", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(mActivity, RequestService.class);
                    //intent.putExtra("data", some_extra_data);
                    mActivity.startService(intent);
                }
            })
            .setPositiveButton("GoTo", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    //GoTo();
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }
            });

    return builder.create();
}

@Override
public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    if(mActivity != null)
    mActivity.finish();
}

并调用片段。

MessageDialog msgDialog = new MessageDialog(YourActivity.this);
msgDialog.setData(mail);
msgDialog.show(fm, "msgDialog");

好的,经过多次尝试,我发现我的 ServerRequestService 不想工作的原因。 Base64 编码字符串作为 URL 的一部分作为参数发送。如果我发送包含西里尔符号的字符串,它会破坏 Base64,并且 JSON 现在发送到服务器是不正确的。解决方案是使用 URLEncoder.encode(Base64.encodeToString(data, Base64.NO_WRAP),"UTF-8"); 编码 URL 字符串参数以避免损坏数据。感谢大家!