是否可以从对话框中调用 onReceive 方法?
Is it possible to call onReceive method from a dialog?
我有一个带有 editText
和 save button
的 自定义对话框 。单击 button
时,我希望它调用 MyReceiver。但是 MyReceiver 中的日志和 Toast 永远不会显示。
提醒
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = LayoutInflater.from(this);
View promptView = getLayoutInflater().inflate(R.layout.dialog_with_edittext, null);
Button save = (Button) promptView.findViewById(R.id.okBtn);
final EditText task = (EditText) promptView.findViewById(R.id.task);
time = (EditText) promptView.findViewById(R.id.time);
date = (EditText) promptView.findViewById(R.id.date);
final AlertDialog alert = builder.create();
date.setOnClickListener(this);
save.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String addTask= task.getText().toString();
String time1= time.getText().toString();
String date1= date.getText().toString();
if (adapter != null) {
adapter.add(addTask,time1,date1);
insertTask(addTask, time1, date1);
listview.setAdapter(adapter);
alert.dismiss();
check();
}
c.set(Calendar.YEAR,year1);
c.set(Calendar.MONTH, month1);
c.set(Calendar.DAY_OF_MONTH, day1);
c.set(Calendar.HOUR_OF_DAY, hour1);
c.set(Calendar.MINUTE, min1);
c.set(Calendar.SECOND, 0);
c.set(Calendar.AM_PM,Calendar.AM);
Toast.makeText(getApplicationContext(),year1+""+month1+""+day1+"",Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(),hour1+""+min1+"",Toast.LENGTH_SHORT).show();
Intent myIntent = new Intent(ReminderPage.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(ReminderPage.this, 123456789, myIntent,0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
Toast.makeText(getApplicationContext(),"Alarm",Toast.LENGTH_SHORT).show();
}
});
alert.setView(promptView);
alert.show();
return true;
MyReceiver
public class MyReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Log.i("App", "called receiver method");
try{
Toast.makeText(context,"Call Utils1",Toast.LENGTH_SHORT).show();
Utils1.generateNotification(context);
}catch(Exception e){
Toast.makeText(context,"Not Call Utils1",Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
}
我也在我的 AndroidMainfest 中添加了这个
<receiver android:name="com.example.MyReceiver"></receiver>
Utils1
public class Utils1 {
public static NotificationManager mManager;
@SuppressWarnings("static-access")
public static void generateNotification(Context context){
mManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
Intent intent1 = new Intent(context,Register.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent1, 0);
Notification.Builder builder = new Notification.Builder(context);
builder.setAutoCancel(false);
builder.setTicker("this is ticker text");
builder.setContentTitle("WhatsApp Notification");
builder.setContentText("You have a new message");
builder.setSmallIcon(R.drawable.done);
builder.setContentIntent(pendingIntent);
builder.setOngoing(true);
builder.setSubText("This is subtext..."); //API level 16
builder.setNumber(100);
builder.build();
Notification myNotication = builder.getNotification();
mManager.notify(0, myNotication);
}
}
如有任何帮助,我们将不胜感激。
可以,但您需要制作自定义对话框。像扩展 DialogFragment 的新 Class 一样自定义。在那里你创建了一个你的接收器实例并像这样注册它:
@Override
protected void onResume() {
super.onResume();
getActivity.registerReceiver(mReceiver, mIntentFilter);
}
@Override
protected void onPause() {
if(mReceiver != null) {
getActivity.unregisterReceiver(mReceiver);
mReceiver = null;
}
super.onPause();
}
向广播接收器发送基于 class 的意图无效。带有 class 的 Intent 用于启动活动,而不是广播消息。
要向广播接收器发送消息,您需要使用带有操作字符串的意图,并在您的清单中使用意图过滤器注册该字符串。
如果您已经有了 data.You 可以像这样使用它:
MyReceiver receiver = new MyReceiver();
receiver.onReceive(context,intent);
通过您的代码而不是系统调用 onReceive()
。
根据你的问题,下面的步骤会给你你想要的。
1.) 在你的 AndroidManifest.xml 中替换你的 receiver
<receiver android:name="com.example.MyReceiver"></receiver>
通过以下方式:
<receiver android:name=".MyReceiver" />
2.) 最后在按钮侦听器的代码中添加:
save.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// ...
getApplicationContext().sendBroadcast(
new Intent(getApplicationContext(), MyReceiver.class));
// ...
}
});
就是这样,现在 运行 您的应用程序。每当您单击 save
按钮时,您会注意到 class MyReceiver
中的 onReceive()
方法将被正确调用。这意味着您的 logcat 输出将是
I/App: called receiver method
如预期,您的 Toast
消息 Call Utils1
也将正确显示。
我有一个带有 editText
和 save button
的 自定义对话框 。单击 button
时,我希望它调用 MyReceiver。但是 MyReceiver 中的日志和 Toast 永远不会显示。
提醒
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = LayoutInflater.from(this);
View promptView = getLayoutInflater().inflate(R.layout.dialog_with_edittext, null);
Button save = (Button) promptView.findViewById(R.id.okBtn);
final EditText task = (EditText) promptView.findViewById(R.id.task);
time = (EditText) promptView.findViewById(R.id.time);
date = (EditText) promptView.findViewById(R.id.date);
final AlertDialog alert = builder.create();
date.setOnClickListener(this);
save.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String addTask= task.getText().toString();
String time1= time.getText().toString();
String date1= date.getText().toString();
if (adapter != null) {
adapter.add(addTask,time1,date1);
insertTask(addTask, time1, date1);
listview.setAdapter(adapter);
alert.dismiss();
check();
}
c.set(Calendar.YEAR,year1);
c.set(Calendar.MONTH, month1);
c.set(Calendar.DAY_OF_MONTH, day1);
c.set(Calendar.HOUR_OF_DAY, hour1);
c.set(Calendar.MINUTE, min1);
c.set(Calendar.SECOND, 0);
c.set(Calendar.AM_PM,Calendar.AM);
Toast.makeText(getApplicationContext(),year1+""+month1+""+day1+"",Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(),hour1+""+min1+"",Toast.LENGTH_SHORT).show();
Intent myIntent = new Intent(ReminderPage.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(ReminderPage.this, 123456789, myIntent,0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
Toast.makeText(getApplicationContext(),"Alarm",Toast.LENGTH_SHORT).show();
}
});
alert.setView(promptView);
alert.show();
return true;
MyReceiver
public class MyReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Log.i("App", "called receiver method");
try{
Toast.makeText(context,"Call Utils1",Toast.LENGTH_SHORT).show();
Utils1.generateNotification(context);
}catch(Exception e){
Toast.makeText(context,"Not Call Utils1",Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
}
我也在我的 AndroidMainfest 中添加了这个
<receiver android:name="com.example.MyReceiver"></receiver>
Utils1
public class Utils1 {
public static NotificationManager mManager;
@SuppressWarnings("static-access")
public static void generateNotification(Context context){
mManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
Intent intent1 = new Intent(context,Register.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent1, 0);
Notification.Builder builder = new Notification.Builder(context);
builder.setAutoCancel(false);
builder.setTicker("this is ticker text");
builder.setContentTitle("WhatsApp Notification");
builder.setContentText("You have a new message");
builder.setSmallIcon(R.drawable.done);
builder.setContentIntent(pendingIntent);
builder.setOngoing(true);
builder.setSubText("This is subtext..."); //API level 16
builder.setNumber(100);
builder.build();
Notification myNotication = builder.getNotification();
mManager.notify(0, myNotication);
}
}
如有任何帮助,我们将不胜感激。
可以,但您需要制作自定义对话框。像扩展 DialogFragment 的新 Class 一样自定义。在那里你创建了一个你的接收器实例并像这样注册它:
@Override
protected void onResume() {
super.onResume();
getActivity.registerReceiver(mReceiver, mIntentFilter);
}
@Override
protected void onPause() {
if(mReceiver != null) {
getActivity.unregisterReceiver(mReceiver);
mReceiver = null;
}
super.onPause();
}
向广播接收器发送基于 class 的意图无效。带有 class 的 Intent 用于启动活动,而不是广播消息。
要向广播接收器发送消息,您需要使用带有操作字符串的意图,并在您的清单中使用意图过滤器注册该字符串。
如果您已经有了 data.You 可以像这样使用它:
MyReceiver receiver = new MyReceiver();
receiver.onReceive(context,intent);
通过您的代码而不是系统调用 onReceive()
。
根据你的问题,下面的步骤会给你你想要的。
1.) 在你的 AndroidManifest.xml 中替换你的 receiver
<receiver android:name="com.example.MyReceiver"></receiver>
通过以下方式:
<receiver android:name=".MyReceiver" />
2.) 最后在按钮侦听器的代码中添加:
save.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// ...
getApplicationContext().sendBroadcast(
new Intent(getApplicationContext(), MyReceiver.class));
// ...
}
});
就是这样,现在 运行 您的应用程序。每当您单击 save
按钮时,您会注意到 class MyReceiver
中的 onReceive()
方法将被正确调用。这意味着您的 logcat 输出将是
I/App: called receiver method
如预期,您的 Toast
消息 Call Utils1
也将正确显示。