android自定义push通知_android通过自定义toast实现悬浮通知效果
时间: 2023-08-30 11:04:03 浏览: 223
首先需要了解一下 Android 中通知的相关知识。Android 中的通知是通过 NotificationManager 来管理的,通知的显示效果是由 Notification 类的实例来控制的。一般情况下,我们可以使用 NotificationCompat 类来构造通知,可以兼容不同版本的 Android 系统。
接下来,我们来介绍一下如何通过自定义 Toast 实现悬浮通知效果:
1. 首先,在 AndroidManifest.xml 文件中添加权限声明:
```xml
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
```
2. 在代码中创建自定义的 Toast 类,并重写其 onWindowFocusChanged() 方法,用于创建悬浮通知:
```java
public class FloatingToast extends Toast {
private WindowManager mWindowManager;
private View mView;
private WindowManager.LayoutParams mParams;
public FloatingToast(Context context) {
super(context);
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mView = LayoutInflater.from(context).inflate(R.layout.floating_toast, null);
mParams = new WindowManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
mParams.gravity = Gravity.TOP | Gravity.START;
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
mWindowManager.addView(mView, mParams);
} else {
mWindowManager.removeView(mView);
}
}
}
```
3. 在布局文件 floating_toast.xml 中定义悬浮通知的样式:
```xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/floating_toast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_floating_toast"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_notification" />
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是一条悬浮通知" />
</LinearLayout>
```
4. 在 Activity 中使用自定义 Toast 实现悬浮通知:
```java
FloatingToast toast = new FloatingToast(this);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(LayoutInflater.from(this).inflate(R.layout.floating_toast, null));
toast.show();
```
5. 最后,记得在 Activity 的 onDestroy() 方法中销毁自定义 Toast 对象:
```java
@Override
protected void onDestroy() {
super.onDestroy();
if (toast != null) {
toast.cancel();
}
}
```
上述代码中的布局文件和相关资源文件可以根据需要自行修改,以实现不同的悬浮通知样式。同时,需要注意的是,由于 Android 8.0 及以上版本对通知权限进行了限制,如果需要在这些系统版本上显示悬浮通知,需要申请权限并设置 targetSdkVersion 为 25 或以下。
阅读全文