android – 在类中扩展BroadcastReceiver使用上下文
作者:互联网
当android中的警报响起时,我想创建一个AlertDialog.此外,我想创建一个通知,具体取决于用户在对话框上的单选按钮中单击的选项.
当我尝试使用context或getApplicationContext()时出现问题.
这是我的代码:
public void onReceive(final Context context, Intent intent)
{
final CharSequence[] items = {" I'm taking the dose now! "," Remind again in ten minutes. "," Ignore for now. "};
String doseName = intent.getStringExtra("doseName");
Toast.makeText(context, "Take medicine: " + doseName, Toast.LENGTH_LONG).show();
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("It's time for your medicine.");
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
switch(item)
{
case 0:
Toast.makeText(context, "Good.", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(context, "Reminder set in ten minutes.", Toast.LENGTH_SHORT).show();
break;
case 2:
Intent service1 = new Intent(context, DoseAlarmService.class);
service1.putExtra("doseName", doseName);
context.startService(service1);
break;
}
}
});
levelDialog = builder.create();
levelDialog.show();
}
我尝试在switch case中使用getApplicationContext而不是context,但这是我得到的确切错误:
The method getApplicationContext() is undefined for the type new DialogInterface.OnClickListener(){}
有关如何前进的任何建议?
编辑:
直到现在,这些都是我尝试过的:
public void onReceive(final Context context, Intent intent)
{
ctx = context;
final CharSequence[] items = {" I'm taking the dose now! "," Remind again in ten minutes. "," Ignore for now. "};
String doseName = intent.getStringExtra("doseName");
Toast.makeText(ctx, "Take medicine: " + doseName, Toast.LENGTH_LONG).show();
AlertDialog.Builder builder = new AlertDialog.Builder(ctx.getApplicationContext());
builder.setTitle("It's time for your medicine.");
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
switch(item)
{
case 0:
Toast.makeText(ctx, "Good.", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(ctx, "Reminder set in ten minutes.", Toast.LENGTH_SHORT).show();
break;
case 2:
Intent service1 = new Intent(ctx.getApplicationContext(), DoseAlarmService.class);
service1.putExtra("doseName", doseName);
ctx.startService(service1);
break;
}
}
});
levelDialog = builder.create();
levelDialog.show();
}
另外,我没有使用ctx,而是直接使用了context.getApplicationContext()并进行了检查.它不起作用.
此外,当我注释掉所有有问题的区域并运行以验证对话框是否出现时,我得到以下异常:
07-23 13:26:21.316: E/AndroidRuntime(1756): java.lang.RuntimeException: Unable to start receiver com.dosemanager.ui.DoseAlarmReceiever: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
请帮忙!
解决方法:
嗯,你已经有了你的上下文 – 它是onReceive()的参数.您不需要使用getApplicationContext().
编辑:你不能在switch case中使用context,因为在Receiver类中定义了context并且你试图在onClickListener类中使用它.
我建议这个:
public class %YOUR_RECEIVER_CLASS% {
private Context context;
public onReceive(Context context, ...) {
this.context = context;
}
}
现在你可以在任何地方使用上下文
标签:android-alertdialog,android,android-alarms,broadcastreceiver 来源: https://codeday.me/bug/20190825/1720547.html