谷歌官方文档已经说了,Android TV要给用户展现的是沉浸式的体验,不希望过多被干扰,所以,普通的Notification是无效的。
思路:一个透明的Activity+自定义Dialog实现类似弹出通知的效果。
先上效果图:
styles.xml
<resources>
<!--透明主题-->
<style name="translucent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
</style>
</resources>
MainActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startService(new Intent(this, NotificationService.class));
}
}
NotificationService.java
public class NotificationService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 模拟15秒之后通知到来
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivity();
}
}, 15000);
return super.onStartCommand(intent, flags, startId);
}
/**
* 弹出通知
*/
private void startActivity() {
Intent intent = new Intent(this, NotificationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
NotificationActivity.java
public class NotificationActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notification);
showNotification();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (!NotificationActivity.this.isDestroyed()) {
// 延迟10秒关闭弹窗
NotificationActivity.this.finish();
}
}
}, 10000);
}
private void showNotification() {
AlertDialog dialog = new AlertDialog.Builder(this).create();
Window dialogWindow = dialog.getWindow();
if (dialogWindow != null) {
dialogWindow.setBackgroundDrawable(new ColorDrawable());
}
dialog.show();
dialog.setContentView(R.layout.layout_dialog);
// 设置window type
dialog.setCanceledOnTouchOutside(true);
if (dialogWindow != null) {
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
dialogWindow.setGravity(Gravity.CENTER | Gravity.TOP);
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
lp.width = (int) (displayMetrics.widthPixels * 0.8); // 宽度
lp.height = (displayMetrics.heightPixels / 3); // 高度
//lp.x = (int) (100 * 0.15); // 新位置X坐标
lp.y = (int) (displayMetrics.heightPixels * 0.05); // 新位置Y坐标
//lp.alpha = 0.7f; // 透明度
dialogWindow.setAttributes(lp);
}
}
}
shape_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="3dp"/>
<solid android:color="#33688698"/>
</shape>
activity_notification.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
layout_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:padding="10dp"
android:background="@drawable/shape_dialog">
<ImageView
android:layout_width="@android:dimen/notification_large_icon_width"
android:layout_height="@android:dimen/notification_large_icon_height"
android:src="@mipmap/ic_launcher"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:textColor="@android:color/white"
android:text="我是通知的详细内容我是通知的详细内容我是通知的详细内容我是通知的详细内容我是通知的详细内容"/>
</LinearLayout>
清单文件:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".NotificationActivity"
android:theme="@style/translucent"/>
<service android:name=".NotificationService"/>