在 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 字符串参数以避免损坏数据。感谢大家!
我已关注 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 字符串参数以避免损坏数据。感谢大家!