android tv 实现弹出通知

谷歌官方文档已经说了,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"/>

猜你喜欢

转载自blog.csdn.net/ithouse/article/details/86605204