我在Android应用程序中实现了警报。报警工作正常。 Toast
消息可见。
现在我想向用户发送提醒箱通知。
以下是来自ReceiverActivity
Class的代码。我试过了
public class ReceiverActivity extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// Code....
new AlertDialog.Builder(context)
.setTitle("Alert Box")
.setMessage("Msg for User")
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
// some coding...
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
arg0.dismiss();
}
}).create().show();
}
}
答案 0 :(得分:7)
虽然您无法从Receiver中显示AlertDialog,因为它需要ActivityContext。
您有另一种解决方案可以显示来自Receiver的AlertDialog等活动。这是可能的。
要启动“活动为对话框”,您应将清单中的活动主题设置为<activity android:theme="@android:style/Theme.Dialog" />
Style Any Activity as an Alert Dialog in Android
从Receiver启动活动使用代码
//Intent mIntent = new Intent();
//mIntent.setClassName("com.test", "com.test.YourActivity");
Intent mIntent = new Intent(context,YourActivity.class) //Same as above two lines
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mIntent);
不使用接收器的AlertDialog背后的另一个原因(即使你设法显示AlertDialog)是
BroadcastReceiver对象仅在通话期间有效 to onReceive(Context,Intent)。一旦你的代码从此返回 功能,系统认为要完成的对象不再 活性
这对你能做些什么有重要的影响 onReceive(Context,Intent)实现:需要的任何东西 异步操作不可用,因为您需要 从函数返回来处理异步操作,但是在 那一点,BroadcastReceiver不再是活动的,因此 系统可以在异步操作之前自由地终止其进程 完成。
特别是, 您可能无法显示对话框或绑定到服务 在BroadcastReceiver中 。对于前者,你应该使用 NotificationManager API。对于后者,你可以使用 Context.startService()将命令发送到服务。 More...
因此,更好的方法是“显示通知”,另一种方法是“将活动用作警报”。
快乐编码:)
答案 1 :(得分:2)
您可以尝试显示带有系统警报属性的对话框:
YourAlertDialog dialog = new YourAlertDialog(mContext);
dialog.getWindow()
.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
在manifest.xml中添加系统警报权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
答案 2 :(得分:0)
您无法在onReceive()的实现中启动弹出对话框。
进一步信息检查AlertDialog from within BroadcastReceiver?? Can it be done?
答案 3 :(得分:0)
我也在寻找这个解决方案,但在搜索了很多东西后,我确实得到了自定义对话框的确切答案。所以此时我发出custom dialog
并在互联网连接断开时自动弹出。首先,我们需要制作一个我们用于弹出的自定义布局,所以这里是我的alertforconnectioncheck.xml
文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fbutton="http://schemas.android.com/tools"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:background="@color/colorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:layout_marginBottom="2dp"
card_view:cardCornerRadius="7dp"
card_view:cardElevation="10dp">
<LinearLayout
android:background="@color/colorPrimary"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="1">
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/nonetwork1"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginLeft="3dp"
android:layout_marginTop="11dp" />
</LinearLayout>
<LinearLayout
android:layout_marginLeft="0dp"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="1">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14dp"
android:gravity="center"
android:textColor="#fff"
android:text="You are not connected to Internet!"
android:layout_marginTop="16dp"
android:layout_below="@+id/image"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<info.hoang8f.widget.FButton
android:layout_width="wrap_content"
android:layout_height="50dp"
android:drawablePadding="0dp"
android:minWidth="150dp"
android:paddingLeft="30dp"
android:paddingRight="20dp"
android:paddingTop="5dp"
android:paddingBottom="10dp"
fbutton:cornerRadius="15dp"
android:layout_gravity="center"
android:gravity="center"
fbutton:shadowEnabled="true"
fbutton:shadowHeight="5dp"
android:id="@+id/ok_button"
android:textColor="@android:color/white"
android:text="OK"
android:layout_marginTop="22dp"
android:layout_below="@+id/text"
android:layout_centerHorizontal="true" />
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
public class NetworkChangeReceiver extends BroadcastReceiver {
String LOG_TAG = "NetworkChangeReceiver";
public boolean isConnected = false;
private SharedPreferences.Editor edit;
private Boolean status;
@Override
public void onReceive(final Context context, final Intent intent) {
Log.v(LOG_TAG, "Receieved notification about network status");
status = isNetworkAvailable(context);
if (status == false) {
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.alertforconnectioncheck);
dialog.setTitle("No Internet Connection...");
Button dialogButton = (Button) dialog.findViewById(R.id.ok_button);
dialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
}
private boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivity = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
if(!isConnected){
Log.v(LOG_TAG, "Now you are connected to Internet!");
Toast.makeText(context, "Now you are connected to Internet!", Toast.LENGTH_LONG).show();
isConnected = true;
}
return true;
}
}
}
}
Log.v(LOG_TAG, "You are not connected to Internet!");
Toast.makeText(context, "You are not connected to Internet!", Toast.LENGTH_LONG).show();
isConnected = false;
return false;
}
}
现在,在MainActivity Class中,调用onCreate
中的广播接收器类:
private NetworkChangeReceiver receiver;
IntentFilter filter;
filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
receiver = new NetworkChangeReceiver();
registerReceiver(receiver, filter);
这是自定义对话框,当互联网关闭时会自动显示,如果您在应用程序中有多个Activities
,则必须在onCreate
中的每个活动中调用它,希望它有助于有人在寻找这个解决方案。