Compare commits
14 Commits
apputils-v
...
powerbell-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ccf6824a6 | ||
|
|
508c8b0b97 | ||
|
|
0d21994291 | ||
|
|
dd08747edb | ||
|
|
603640b3cb | ||
|
|
5b06ce9699 | ||
|
|
363fc6c7c1 | ||
|
|
7f43f8b5c5 | ||
|
|
a117e6e110 | ||
|
|
c1f576e343 | ||
|
|
1dad84b65e | ||
|
|
1ae377e665 | ||
|
|
02fa0a4134 | ||
|
|
a730aa3f92 |
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sat Mar 15 15:30:02 HKT 2025
|
#Thu Mar 20 16:41:52 GMT 2025
|
||||||
stageCount=3
|
stageCount=6
|
||||||
libraryProject=libappbase
|
libraryProject=libappbase
|
||||||
baseVersion=15.0
|
baseVersion=15.0
|
||||||
publishVersion=15.0.2
|
publishVersion=15.0.5
|
||||||
buildCount=0
|
buildCount=4
|
||||||
baseBetaVersion=15.0.3
|
baseBetaVersion=15.0.6
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
android:name=".App"
|
android:name=".App"
|
||||||
android:icon="@drawable/ic_launcher"
|
android:icon="@drawable/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/MyAppTheme"
|
android:theme="@style/MyAPPBaseTheme"
|
||||||
android:resizeableActivity="true">
|
android:resizeableActivity="true">
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
|
|||||||
@@ -179,16 +179,16 @@
|
|||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
<cc.winboll.studio.libappbase.LogView
|
|
||||||
android:layout_height="500dp"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:id="@+id/activitymainLogView1"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
|
<cc.winboll.studio.libappbase.LogView
|
||||||
|
android:layout_height="300dp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:id="@+id/activitymainLogView1"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<color name="colorPrimary">#005800FF</color>
|
<color name="colorPrimary">#FF00B322</color>
|
||||||
<color name="colorPrimaryDark">#005800FF</color>
|
<color name="colorPrimaryDark">#FF005C12</color>
|
||||||
<color name="colorAccent">#005800FF</color>
|
<color name="colorAccent">#FF8DFFA2</color>
|
||||||
|
<color name="colorText">#FFFFFB8D</color>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<style name="MyAppTheme" parent="APPBaseTheme">
|
<style name="MyAPPBaseTheme" parent="APPBaseTheme">
|
||||||
<item name="attrColorPrimary">@color/colorPrimary</item>
|
<item name="attrColorPrimary">@color/colorPrimary</item>
|
||||||
<item name="themeGlobalCrashActivity">@style/MyGlobalCrashActivityTheme</item>
|
<item name="themeGlobalCrashActivity">@style/MyGlobalCrashActivityTheme</item>
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
26
build.gradle
26
build.gradle
@@ -1,6 +1,12 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
buildscript {
|
buildscript {
|
||||||
repositories {
|
repositories {
|
||||||
|
// Nexus Maven 库地址
|
||||||
|
// "WinBoll Release"
|
||||||
|
maven { url "https://nexus.winboll.cc/repository/maven-public/" }
|
||||||
|
// "WinBoll Snapshot"
|
||||||
|
maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" }
|
||||||
|
|
||||||
maven { url 'https://maven.aliyun.com/repository/public/' }
|
maven { url 'https://maven.aliyun.com/repository/public/' }
|
||||||
maven { url 'https://maven.aliyun.com/repository/google/' }
|
maven { url 'https://maven.aliyun.com/repository/google/' }
|
||||||
maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
|
maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
|
||||||
@@ -9,13 +15,6 @@ buildscript {
|
|||||||
maven { url "https://jitpack.io" }
|
maven { url "https://jitpack.io" }
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
google()
|
google()
|
||||||
|
|
||||||
// Nexus Maven 库地址
|
|
||||||
// "WinBoll Release"
|
|
||||||
maven { url "https://nexus.winboll.cc/repository/maven-public/" }
|
|
||||||
// "WinBoll Snapshot"
|
|
||||||
maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" }
|
|
||||||
|
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -27,6 +26,12 @@ buildscript {
|
|||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
|
// Nexus Maven 库地址
|
||||||
|
// "WinBoll Release"
|
||||||
|
maven { url "https://nexus.winboll.cc/repository/maven-public/" }
|
||||||
|
// "WinBoll Snapshot"
|
||||||
|
maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" }
|
||||||
|
|
||||||
maven { url 'https://maven.aliyun.com/repository/public/' }
|
maven { url 'https://maven.aliyun.com/repository/public/' }
|
||||||
maven { url 'https://maven.aliyun.com/repository/google/' }
|
maven { url 'https://maven.aliyun.com/repository/google/' }
|
||||||
maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
|
maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
|
||||||
@@ -35,13 +40,6 @@ allprojects {
|
|||||||
maven { url "https://jitpack.io" }
|
maven { url "https://jitpack.io" }
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
google()
|
google()
|
||||||
|
|
||||||
// Nexus Maven 库地址
|
|
||||||
// "WinBoll Release"
|
|
||||||
maven { url "https://nexus.winboll.cc/repository/maven-public/" }
|
|
||||||
// "WinBoll Snapshot"
|
|
||||||
maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" }
|
|
||||||
|
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
}
|
}
|
||||||
ext {
|
ext {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sat Mar 15 15:29:07 HKT 2025
|
#Thu Mar 20 16:41:52 GMT 2025
|
||||||
stageCount=3
|
stageCount=6
|
||||||
libraryProject=libappbase
|
libraryProject=libappbase
|
||||||
baseVersion=15.0
|
baseVersion=15.0
|
||||||
publishVersion=15.0.2
|
publishVersion=15.0.5
|
||||||
buildCount=0
|
buildCount=4
|
||||||
baseBetaVersion=15.0.3
|
baseBetaVersion=15.0.6
|
||||||
|
|||||||
@@ -190,6 +190,7 @@ public class LogView extends RelativeLayout {
|
|||||||
|
|
||||||
// 加载标签表
|
// 加载标签表
|
||||||
mListViewTags = findViewById(cc.winboll.studio.libappbase.R.id.tags_listview);
|
mListViewTags = findViewById(cc.winboll.studio.libappbase.R.id.tags_listview);
|
||||||
|
mListViewTags.setVerticalOffset(10);
|
||||||
mTAGListAdapter = new TAGListAdapter(mContext, mapTAGList);
|
mTAGListAdapter = new TAGListAdapter(mContext, mapTAGList);
|
||||||
mListViewTags.setAdapter(mTAGListAdapter);
|
mListViewTags.setAdapter(mTAGListAdapter);
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ import android.widget.ListView;
|
|||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
|
||||||
public class HorizontalListView extends ListView {
|
public class HorizontalListView extends ListView {
|
||||||
|
|
||||||
public static final String TAG = "HorizontalListView";
|
public static final String TAG = "HorizontalListView";
|
||||||
|
int verticalOffset = 0;
|
||||||
|
|
||||||
public HorizontalListView(Context context) {
|
public HorizontalListView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
@@ -25,25 +27,10 @@ public class HorizontalListView extends ListView {
|
|||||||
public HorizontalListView(Context context, AttributeSet attrs, int defStyle) {
|
public HorizontalListView(Context context, AttributeSet attrs, int defStyle) {
|
||||||
super(context, attrs, defStyle);
|
super(context, attrs, defStyle);
|
||||||
}
|
}
|
||||||
// @Override
|
|
||||||
// protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
public void setVerticalOffset(int verticalOffset) {
|
||||||
// super.onLayout(changed, l, t, r, b);
|
this.verticalOffset = verticalOffset;
|
||||||
// int childCount = getChildCount();
|
}
|
||||||
// int left = getPaddingLeft();
|
|
||||||
// // 获取HorizontalListView的高度
|
|
||||||
// int viewHeight = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
|
|
||||||
// for (int i = 0; i < childCount; i++) {
|
|
||||||
// View child = getChildAt(i);
|
|
||||||
// int width = child.getMeasuredWidth();
|
|
||||||
// int height = child.getMeasuredHeight();
|
|
||||||
// // 计算子项在垂直方向上的居中偏移量
|
|
||||||
// int verticalOffset = (viewHeight - height) / 2;
|
|
||||||
// // 设置子视图的位置,实现水平布局并垂直居中
|
|
||||||
// child.layout(left, getPaddingTop() + verticalOffset, left + width, getPaddingTop() + verticalOffset + height);
|
|
||||||
// left += width;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||||
@@ -52,7 +39,7 @@ public class HorizontalListView extends ListView {
|
|||||||
int left = getPaddingLeft();
|
int left = getPaddingLeft();
|
||||||
int viewHeight = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
|
int viewHeight = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
|
||||||
LogUtils.d(TAG, String.format("HorizontalListView的高度 %d", viewHeight));
|
LogUtils.d(TAG, String.format("HorizontalListView的高度 %d", viewHeight));
|
||||||
int verticalOffset = 20;
|
|
||||||
for (int i = 0; i < childCount; i++) {
|
for (int i = 0; i < childCount; i++) {
|
||||||
View child = getChildAt(i);
|
View child = getChildAt(i);
|
||||||
// 计算每个子视图的宽度和高度
|
// 计算每个子视图的宽度和高度
|
||||||
@@ -60,7 +47,7 @@ public class HorizontalListView extends ListView {
|
|||||||
int height = child.getMeasuredHeight();
|
int height = child.getMeasuredHeight();
|
||||||
//LogUtils.d(TAG, String.format("child : width %d , height %d", width, height));
|
//LogUtils.d(TAG, String.format("child : width %d , height %d", width, height));
|
||||||
// 设置子视图的位置,实现水平布局
|
// 设置子视图的位置,实现水平布局
|
||||||
|
|
||||||
child.layout(left, verticalOffset, left + width, verticalOffset + height);
|
child.layout(left, verticalOffset, left + width, verticalOffset + height);
|
||||||
left += width;
|
left += width;
|
||||||
}
|
}
|
||||||
@@ -68,15 +55,11 @@ public class HorizontalListView extends ListView {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
|
|
||||||
int newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
|
int newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
|
||||||
//super.onMeasure(widthMeasureSpec, newHeightMeasureSpec);
|
//super.onMeasure(widthMeasureSpec, newHeightMeasureSpec);
|
||||||
int newWidthMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
|
int newWidthMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
|
||||||
//LogUtils.d(TAG, String.format("newWidthMeasureSpec %d, newHeightMeasureSpec %d", newWidthMeasureSpec, newHeightMeasureSpec));
|
//LogUtils.d(TAG, String.format("newWidthMeasureSpec %d, newHeightMeasureSpec %d", newWidthMeasureSpec, newHeightMeasureSpec));
|
||||||
super.onMeasure(newWidthMeasureSpec, newHeightMeasureSpec);
|
super.onMeasure(newWidthMeasureSpec, newHeightMeasureSpec);
|
||||||
|
|
||||||
// ViewGroup.LayoutParams params = getLayoutParams();
|
|
||||||
// params.width = getMeasuredWidth();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
libappbase/src/main/res/drawable/bg_border_round.xml
Normal file
13
libappbase/src/main/res/drawable/bg_border_round.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<stroke
|
||||||
|
android:width="1dp"
|
||||||
|
android:color="#000000" /> <!-- 这里可调整边框宽度和颜色 -->
|
||||||
|
<solid android:color="@android:color/transparent" />
|
||||||
|
<corners
|
||||||
|
android:bottomLeftRadius="6dip"
|
||||||
|
android:bottomRightRadius="6dip"
|
||||||
|
android:topLeftRadius="6dip"
|
||||||
|
android:topRightRadius="6dip" />
|
||||||
|
</shape>
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
<shape android:shape="rectangle" >
|
<shape android:shape="rectangle" >
|
||||||
<gradient
|
<gradient
|
||||||
android:angle="270"
|
android:angle="270"
|
||||||
android:endColor="#0F000000"
|
android:endColor="@color/colorAccent"
|
||||||
android:startColor="#0F000000" />
|
android:startColor="@color/colorAccent" />
|
||||||
<corners
|
<corners
|
||||||
android:bottomLeftRadius="6dip"
|
android:bottomLeftRadius="6dip"
|
||||||
android:bottomRightRadius="6dip"
|
android:bottomRightRadius="6dip"
|
||||||
|
|||||||
@@ -5,18 +5,18 @@
|
|||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="#FFEEEEEE">
|
android:background="@drawable/bg_border_round">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="24dp"
|
android:layout_height="@dimen/button_height"
|
||||||
android:layout_marginLeft="5dp"
|
android:layout_marginLeft="5dp"
|
||||||
android:id="@+id/viewlogtagTextView1"/>
|
android:id="@+id/viewlogtagTextView1"/>
|
||||||
|
|
||||||
<CheckBox
|
<CheckBox
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="24dp"
|
android:layout_height="@dimen/button_height"
|
||||||
android:id="@+id/viewlogtagCheckBox1"/>
|
android:id="@+id/viewlogtagCheckBox1"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -72,27 +72,29 @@
|
|||||||
android:layout_below="@+id/viewlogRelativeLayoutToolbar"
|
android:layout_below="@+id/viewlogRelativeLayoutToolbar"
|
||||||
android:id="@+id/viewlogLinearLayout1"
|
android:id="@+id/viewlogLinearLayout1"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:background="#FFC0F4C2">
|
android:background="@drawable/bg_shadow">
|
||||||
|
|
||||||
<CheckBox
|
<CheckBox
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="@dimen/button_height"
|
||||||
android:text="ALL"
|
android:text="ALL"
|
||||||
android:id="@+id/viewlogCheckBox1"/>
|
android:id="@+id/viewlogCheckBox1"
|
||||||
|
android:background="@drawable/bg_border_round"
|
||||||
|
android:layout_marginLeft="5dp"
|
||||||
|
android:layout_marginRight="5dp"/>
|
||||||
|
|
||||||
<HorizontalScrollView
|
<HorizontalScrollView
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:background="@drawable/bg_border"
|
||||||
android:scrollbars="none"
|
android:scrollbars="none"
|
||||||
android:layout_weight="1.0"
|
android:padding="5dp"
|
||||||
android:background="#FF97F2E3">
|
android:layout_weight="1.0">
|
||||||
|
|
||||||
<cc.winboll.studio.libappbase.views.HorizontalListView
|
<cc.winboll.studio.libappbase.views.HorizontalListView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="@drawable/view_border"
|
android:id="@+id/tags_listview"/>
|
||||||
android:id="@+id/tags_listview"
|
|
||||||
android:paddingLeft="10dp"/>
|
|
||||||
|
|
||||||
</HorizontalScrollView>
|
</HorizontalScrollView>
|
||||||
|
|
||||||
|
|||||||
9
libappbase/src/main/res/values/dimens.xml
Normal file
9
libappbase/src/main/res/values/dimens.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- 定义一个名为text_size_normal的尺寸,值为16sp -->
|
||||||
|
<dimen name="text_size_normal">16sp</dimen>
|
||||||
|
<!-- 定义一个名为margin_small的尺寸,值为8dp -->
|
||||||
|
<dimen name="margin_small">8dp</dimen>
|
||||||
|
<!-- 定义一个名为image_width的尺寸,值为200dp -->
|
||||||
|
<dimen name="button_height">24dp</dimen>
|
||||||
|
</resources>
|
||||||
@@ -41,11 +41,6 @@ android {
|
|||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_11
|
|
||||||
targetCompatibility JavaVersion.VERSION_11
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Thu Jan 02 11:13:45 HKT 2025
|
#Sat Mar 22 06:01:46 HKT 2025
|
||||||
stageCount=6
|
stageCount=7
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=4.0
|
baseVersion=4.0
|
||||||
publishVersion=4.0.5
|
publishVersion=4.0.6
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=4.0.6
|
baseBetaVersion=4.0.7
|
||||||
|
|||||||
@@ -2,10 +2,9 @@
|
|||||||
<manifest
|
<manifest
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="cc.winboll.studio.powerbell">
|
package="cc.winboll.studio.powerbell">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<!-- 拍摄照片和视频 -->
|
||||||
<uses-feature android:name="android.hardware.camera" />
|
<uses-permission android:name="android.permission.CAMERA"/>
|
||||||
<uses-feature android:name="android.hardware.camera.autofocus" />
|
|
||||||
|
|
||||||
<!-- 运行前台服务 -->
|
<!-- 运行前台服务 -->
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||||
@@ -22,6 +21,23 @@
|
|||||||
<!-- MANAGE_EXTERNAL_STORAGE -->
|
<!-- MANAGE_EXTERNAL_STORAGE -->
|
||||||
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
|
||||||
|
|
||||||
|
<!-- 显示通知 -->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||||
|
|
||||||
|
<uses-feature android:name="android.hardware.camera"/>
|
||||||
|
|
||||||
|
<uses-feature android:name="android.hardware.camera.autofocus"/>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".GlobalApplication"
|
android:name=".GlobalApplication"
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
@@ -34,7 +50,8 @@
|
|||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:launchMode="singleTask">
|
android:launchMode="singleTask"
|
||||||
|
android:exported="true">
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import cc.winboll.studio.powerbell.activities.AboutActivity;
|
|||||||
import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity;
|
import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity;
|
||||||
import cc.winboll.studio.powerbell.activities.ClearRecordActivity;
|
import cc.winboll.studio.powerbell.activities.ClearRecordActivity;
|
||||||
import cc.winboll.studio.powerbell.fragments.MainViewFragment;
|
import cc.winboll.studio.powerbell.fragments.MainViewFragment;
|
||||||
import cc.winboll.studio.powerbell.utils.NotificationUtils;
|
import cc.winboll.studio.powerbell.utils.NotificationHelper;
|
||||||
import cc.winboll.studio.shared.log.LogUtils;
|
import cc.winboll.studio.shared.log.LogUtils;
|
||||||
import cc.winboll.studio.shared.log.LogView;
|
import cc.winboll.studio.shared.log.LogView;
|
||||||
|
|
||||||
@@ -64,8 +64,10 @@ public class MainActivity extends Activity {
|
|||||||
}
|
}
|
||||||
showFragment(mMainViewFragment);
|
showFragment(mMainViewFragment);
|
||||||
|
|
||||||
NotificationUtils notificationUtils = new NotificationUtils(this);
|
// NotificationHelper notificationUtils = new NotificationHelper(this);
|
||||||
notificationUtils.createNotificationChannel();
|
// notificationUtils.createNotificationChannels();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void showFragment(Fragment fragment) {
|
void showFragment(Fragment fragment) {
|
||||||
@@ -113,7 +115,7 @@ public class MainActivity extends Activity {
|
|||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
// 回到窗口自动取消提醒消息
|
// 回到窗口自动取消提醒消息
|
||||||
NotificationUtils.cancelRemindNotification(this);
|
//NotificationHelper.cancelRemindNotification(this);
|
||||||
|
|
||||||
reloadBackground();
|
reloadBackground();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import cc.winboll.studio.powerbell.GlobalApplication;
|
|||||||
import cc.winboll.studio.powerbell.fragments.MainViewFragment;
|
import cc.winboll.studio.powerbell.fragments.MainViewFragment;
|
||||||
import cc.winboll.studio.powerbell.utils.AppConfigUtils;
|
import cc.winboll.studio.powerbell.utils.AppConfigUtils;
|
||||||
import cc.winboll.studio.powerbell.utils.BatteryUtils;
|
import cc.winboll.studio.powerbell.utils.BatteryUtils;
|
||||||
import cc.winboll.studio.powerbell.utils.NotificationUtils;
|
import cc.winboll.studio.powerbell.utils.NotificationHelper;
|
||||||
|
|
||||||
public class GlobalApplicationReceiver extends BroadcastReceiver {
|
public class GlobalApplicationReceiver extends BroadcastReceiver {
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ public class GlobalApplicationReceiver extends BroadcastReceiver {
|
|||||||
// 新电池状态标志某一个有变化就更新显示信息
|
// 新电池状态标志某一个有变化就更新显示信息
|
||||||
if (_mIsCharging != isCharging || _mnTheQuantityOfElectricityOld != nTheQuantityOfElectricity) {
|
if (_mIsCharging != isCharging || _mnTheQuantityOfElectricityOld != nTheQuantityOfElectricity) {
|
||||||
// 电池状态改变先取消旧的提醒消息
|
// 电池状态改变先取消旧的提醒消息
|
||||||
NotificationUtils.cancelRemindNotification(context);
|
//NotificationHelper.cancelRemindNotification(context);
|
||||||
|
|
||||||
GlobalApplication.getAppCacheUtils(context).addChangingTime(nTheQuantityOfElectricity);
|
GlobalApplication.getAppCacheUtils(context).addChangingTime(nTheQuantityOfElectricity);
|
||||||
MainViewFragment.sendMsgCurrentValueBattery(nTheQuantityOfElectricity);
|
MainViewFragment.sendMsgCurrentValueBattery(nTheQuantityOfElectricity);
|
||||||
|
|||||||
@@ -8,14 +8,17 @@ package cc.winboll.studio.powerbell.services;
|
|||||||
* Android Service之onStartCommand方法研究
|
* Android Service之onStartCommand方法研究
|
||||||
* https://blog.csdn.net/cyp331203/article/details/38920491
|
* https://blog.csdn.net/cyp331203/article/details/38920491
|
||||||
*/
|
*/
|
||||||
import cc.winboll.studio.powerbell.R;
|
import android.app.Notification;
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.ServiceConnection;
|
import android.content.ServiceConnection;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
|
import android.widget.RemoteViews;
|
||||||
import cc.winboll.studio.powerbell.GlobalApplication;
|
import cc.winboll.studio.powerbell.GlobalApplication;
|
||||||
|
import cc.winboll.studio.powerbell.MainActivity;
|
||||||
|
import cc.winboll.studio.powerbell.R;
|
||||||
import cc.winboll.studio.powerbell.beans.AppConfigBean;
|
import cc.winboll.studio.powerbell.beans.AppConfigBean;
|
||||||
import cc.winboll.studio.powerbell.beans.NotificationMessage;
|
import cc.winboll.studio.powerbell.beans.NotificationMessage;
|
||||||
import cc.winboll.studio.powerbell.handlers.ControlCenterServiceHandler;
|
import cc.winboll.studio.powerbell.handlers.ControlCenterServiceHandler;
|
||||||
@@ -24,11 +27,12 @@ import cc.winboll.studio.powerbell.services.AssistantService;
|
|||||||
import cc.winboll.studio.powerbell.threads.RemindThread;
|
import cc.winboll.studio.powerbell.threads.RemindThread;
|
||||||
import cc.winboll.studio.powerbell.utils.AppCacheUtils;
|
import cc.winboll.studio.powerbell.utils.AppCacheUtils;
|
||||||
import cc.winboll.studio.powerbell.utils.AppConfigUtils;
|
import cc.winboll.studio.powerbell.utils.AppConfigUtils;
|
||||||
import cc.winboll.studio.powerbell.utils.NotificationUtils;
|
import cc.winboll.studio.powerbell.utils.NotificationHelper;
|
||||||
import cc.winboll.studio.powerbell.utils.ServiceUtils;
|
import cc.winboll.studio.powerbell.utils.ServiceUtils;
|
||||||
import cc.winboll.studio.powerbell.utils.StringUtils;
|
import cc.winboll.studio.powerbell.utils.StringUtils;
|
||||||
import cc.winboll.studio.shared.log.LogUtils;
|
import cc.winboll.studio.shared.log.LogUtils;
|
||||||
import com.hjq.toast.ToastUtils;
|
import com.hjq.toast.ToastUtils;
|
||||||
|
import android.graphics.Color;
|
||||||
|
|
||||||
public class ControlCenterService extends Service {
|
public class ControlCenterService extends Service {
|
||||||
|
|
||||||
@@ -43,7 +47,8 @@ public class ControlCenterService extends Service {
|
|||||||
AppConfigUtils mAppConfigUtils;
|
AppConfigUtils mAppConfigUtils;
|
||||||
AppCacheUtils mAppCacheUtils;
|
AppCacheUtils mAppCacheUtils;
|
||||||
// 前台服务通知工具
|
// 前台服务通知工具
|
||||||
NotificationUtils mNotificationUtils;
|
NotificationHelper mNotificationHelper;
|
||||||
|
Notification notification;
|
||||||
RemindThread mRemindThread;
|
RemindThread mRemindThread;
|
||||||
ControlCenterServiceHandler mControlCenterServiceHandler;
|
ControlCenterServiceHandler mControlCenterServiceHandler;
|
||||||
MyServiceConnection mMyServiceConnection;
|
MyServiceConnection mMyServiceConnection;
|
||||||
@@ -66,7 +71,9 @@ public class ControlCenterService extends Service {
|
|||||||
isServiceRunning = false;
|
isServiceRunning = false;
|
||||||
mAppConfigUtils = GlobalApplication.getAppConfigUtils(this);
|
mAppConfigUtils = GlobalApplication.getAppConfigUtils(this);
|
||||||
mAppCacheUtils = GlobalApplication.getAppCacheUtils(this);
|
mAppCacheUtils = GlobalApplication.getAppCacheUtils(this);
|
||||||
mNotificationUtils = new NotificationUtils(ControlCenterService.this);
|
mNotificationHelper = new NotificationHelper(ControlCenterService.this);
|
||||||
|
|
||||||
|
|
||||||
if (mMyServiceConnection == null) {
|
if (mMyServiceConnection == null) {
|
||||||
mMyServiceConnection = new MyServiceConnection();
|
mMyServiceConnection = new MyServiceConnection();
|
||||||
}
|
}
|
||||||
@@ -92,10 +99,16 @@ public class ControlCenterService extends Service {
|
|||||||
// 唤醒守护进程
|
// 唤醒守护进程
|
||||||
wakeupAndBindAssistant();
|
wakeupAndBindAssistant();
|
||||||
// 显示前台通知栏
|
// 显示前台通知栏
|
||||||
NotificationMessage notificationMessage=createNotificationMessage();
|
// 在Service中
|
||||||
//Toast.makeText(getApplication(), "", Toast.LENGTH_SHORT).show();
|
NotificationHelper helper = new NotificationHelper(this);
|
||||||
mNotificationUtils.createForegroundNotification(this, notificationMessage);
|
Intent intent = new Intent(this, MainActivity.class);
|
||||||
mNotificationUtils.createRemindNotification(this, notificationMessage);
|
notification = helper.showForegroundNotification(intent, getString(R.string.app_name), "Service Running, Click to open app");
|
||||||
|
startForeground(NotificationHelper.FOREGROUND_NOTIFICATION_ID, notification);
|
||||||
|
|
||||||
|
// NotificationMessage notificationMessage=createNotificationMessage();
|
||||||
|
// //Toast.makeText(getApplication(), "", Toast.LENGTH_SHORT).show();
|
||||||
|
// mNotificationUtils.createForegroundNotification(this, notificationMessage);
|
||||||
|
// mNotificationUtils.createRemindNotification(this, notificationMessage);
|
||||||
|
|
||||||
if (mControlCenterServiceReceiver == null) {
|
if (mControlCenterServiceReceiver == null) {
|
||||||
// 注册广播接收器
|
// 注册广播接收器
|
||||||
@@ -126,19 +139,19 @@ public class ControlCenterService extends Service {
|
|||||||
// 更新前台通知
|
// 更新前台通知
|
||||||
//
|
//
|
||||||
public void updateServiceNotification() {
|
public void updateServiceNotification() {
|
||||||
mNotificationUtils.updateForegroundNotification(ControlCenterService.this, createNotificationMessage());
|
//mNotificationUtils.updateForegroundNotification(ControlCenterService.this, createNotificationMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新前台通知
|
// 更新前台通知
|
||||||
//
|
//
|
||||||
public void updateServiceNotification(NotificationMessage notificationMessage) {
|
public void updateServiceNotification(NotificationMessage notificationMessage) {
|
||||||
mNotificationUtils.updateForegroundNotification(ControlCenterService.this, notificationMessage);
|
//mNotificationUtils.updateForegroundNotification(ControlCenterService.this, notificationMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新前台通知
|
// 更新前台通知
|
||||||
//
|
//
|
||||||
public void updateRemindNotification(NotificationMessage notificationMessage) {
|
public void updateRemindNotification(NotificationMessage notificationMessage) {
|
||||||
mNotificationUtils.updateRemindNotification(ControlCenterService.this, notificationMessage);
|
//mNotificationUtils.updateRemindNotification(ControlCenterService.this, notificationMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 唤醒和绑定守护进程
|
// 唤醒和绑定守护进程
|
||||||
@@ -234,10 +247,32 @@ public class ControlCenterService extends Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void appenRemindMSG(String szRemindMSG) {
|
public void appenRemindMSG(String szRemindMSG) {
|
||||||
NotificationMessage notificationMessage = createNotificationMessage();
|
String msg = "";
|
||||||
notificationMessage.setRemindMSG(szRemindMSG);
|
for (int i = 0; i < 20; i++) {
|
||||||
//LogUtils.d(TAG, "notificationMessage : " + notificationMessage.getRemindMSG());
|
msg += szRemindMSG;
|
||||||
updateRemindNotification(notificationMessage);
|
}
|
||||||
|
NotificationHelper helper = new NotificationHelper(ControlCenterService.this);
|
||||||
|
Intent intent = new Intent(ControlCenterService.this, MainActivity.class);
|
||||||
|
helper.showTemporaryNotification(intent, getString(R.string.app_name), msg);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// NotificationMessage notificationMessage = createNotificationMessage();
|
||||||
|
// notificationMessage.setRemindMSG(szRemindMSG);
|
||||||
|
// //LogUtils.d(TAG, "notificationMessage : " + notificationMessage.getRemindMSG());
|
||||||
|
// updateRemindNotification(notificationMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置颜色背景
|
||||||
|
public static RemoteViews setLinearLayoutColor(RemoteViews remoteViews, int viewId, int color) {
|
||||||
|
remoteViews.setInt(viewId, "setBackgroundColor", color);
|
||||||
|
return remoteViews;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置Drawable背景
|
||||||
|
public static RemoteViews setLinearLayoutDrawable(RemoteViews remoteViews, int viewId, int drawableRes) {
|
||||||
|
remoteViews.setInt(viewId, "setBackgroundResource", drawableRes);
|
||||||
|
return remoteViews;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ public class AppConfigUtils {
|
|||||||
//
|
//
|
||||||
void saveConfigData() {
|
void saveConfigData() {
|
||||||
// 更新配置先取消一下旧的的提醒消息
|
// 更新配置先取消一下旧的的提醒消息
|
||||||
NotificationUtils.cancelRemindNotification(mContext);
|
//NotificationHelper.cancelRemindNotification(mContext);
|
||||||
|
|
||||||
AppConfigBean.saveBean(mContext, mAppConfigBean);
|
AppConfigBean.saveBean(mContext, mAppConfigBean);
|
||||||
// 通知活动窗口和服务配置已更新
|
// 通知活动窗口和服务配置已更新
|
||||||
|
|||||||
@@ -0,0 +1,150 @@
|
|||||||
|
package cc.winboll.studio.powerbell.utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen@AliYun.Com
|
||||||
|
* @Date 2025/03/22 04:39:40
|
||||||
|
* @Describe 通知工具类
|
||||||
|
*/
|
||||||
|
import android.app.Notification;
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.widget.RemoteViews;
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import cc.winboll.studio.powerbell.R;
|
||||||
|
|
||||||
|
public class NotificationHelper {
|
||||||
|
public static final String TAG = "NotificationHelper";
|
||||||
|
|
||||||
|
// 渠道ID和名称
|
||||||
|
private static final String CHANNEL_ID_FOREGROUND = "foreground_channel";
|
||||||
|
private static final String CHANNEL_NAME_FOREGROUND = "Foreground Service";
|
||||||
|
private static final String CHANNEL_ID_TEMPORARY = "temporary_channel";
|
||||||
|
private static final String CHANNEL_NAME_TEMPORARY = "Temporary Notifications";
|
||||||
|
|
||||||
|
// 通知ID
|
||||||
|
public static final int FOREGROUND_NOTIFICATION_ID = 1001;
|
||||||
|
public static final int TEMPORARY_NOTIFICATION_ID = 2001;
|
||||||
|
|
||||||
|
private final Context mContext;
|
||||||
|
private final NotificationManager mNotificationManager;
|
||||||
|
|
||||||
|
public NotificationHelper(Context context) {
|
||||||
|
mContext = context;
|
||||||
|
mNotificationManager = context.getSystemService(NotificationManager.class);
|
||||||
|
createNotificationChannels();
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||||
|
private void createNotificationChannels() {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
createForegroundChannel();
|
||||||
|
createTemporaryChannel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||||
|
private void createForegroundChannel() {
|
||||||
|
NotificationChannel channel = new NotificationChannel(
|
||||||
|
CHANNEL_ID_FOREGROUND,
|
||||||
|
CHANNEL_NAME_FOREGROUND,
|
||||||
|
NotificationManager.IMPORTANCE_LOW
|
||||||
|
);
|
||||||
|
channel.setDescription("Persistent service notifications");
|
||||||
|
channel.setSound(null, null);
|
||||||
|
channel.enableVibration(false);
|
||||||
|
mNotificationManager.createNotificationChannel(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||||
|
private void createTemporaryChannel() {
|
||||||
|
NotificationChannel channel = new NotificationChannel(
|
||||||
|
CHANNEL_ID_TEMPORARY,
|
||||||
|
CHANNEL_NAME_TEMPORARY,
|
||||||
|
NotificationManager.IMPORTANCE_HIGH
|
||||||
|
);
|
||||||
|
channel.setDescription("Temporary alert notifications");
|
||||||
|
channel.setSound(null, null);
|
||||||
|
channel.enableVibration(true);
|
||||||
|
channel.setVibrationPattern(new long[]{100, 200, 300, 400});
|
||||||
|
channel.setBypassDnd(true);
|
||||||
|
mNotificationManager.createNotificationChannel(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示常驻通知(通常用于前台服务)
|
||||||
|
public Notification showForegroundNotification(Intent intent, String title, String content) {
|
||||||
|
PendingIntent pendingIntent = createPendingIntent(intent);
|
||||||
|
|
||||||
|
Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_FOREGROUND)
|
||||||
|
.setSmallIcon(R.drawable.ic_launcher)
|
||||||
|
.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher))
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(content)
|
||||||
|
.setContentIntent(pendingIntent)
|
||||||
|
.setPriority(NotificationCompat.PRIORITY_LOW)
|
||||||
|
.setOngoing(true)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification);
|
||||||
|
return notification;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示临时通知(自动消失)
|
||||||
|
public void showTemporaryNotification(Intent intent, String title, String content) {
|
||||||
|
PendingIntent pendingIntent = createPendingIntent(intent);
|
||||||
|
|
||||||
|
Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY)
|
||||||
|
.setSmallIcon(R.drawable.ic_launcher)
|
||||||
|
.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher))
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(content)
|
||||||
|
.setContentIntent(pendingIntent)
|
||||||
|
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setVibrate(new long[]{100, 200, 300, 400})
|
||||||
|
.build();
|
||||||
|
|
||||||
|
mNotificationManager.notify(TEMPORARY_NOTIFICATION_ID, notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建自定义布局通知(可扩展)
|
||||||
|
public void showCustomNotification(Intent intent, RemoteViews contentView, RemoteViews bigContentView) {
|
||||||
|
PendingIntent pendingIntent = createPendingIntent(intent);
|
||||||
|
|
||||||
|
Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY)
|
||||||
|
.setSmallIcon(R.drawable.ic_launcher)
|
||||||
|
.setContentIntent(pendingIntent)
|
||||||
|
.setContent(contentView)
|
||||||
|
.setCustomBigContentView(bigContentView)
|
||||||
|
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
mNotificationManager.notify(TEMPORARY_NOTIFICATION_ID + 1, notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 取消所有通知
|
||||||
|
public void cancelAllNotifications() {
|
||||||
|
mNotificationManager.cancelAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建PendingIntent(兼容不同API版本)
|
||||||
|
private PendingIntent createPendingIntent(Intent intent) {
|
||||||
|
int flags = PendingIntent.FLAG_UPDATE_CURRENT;
|
||||||
|
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
// flags |= PendingIntent.FLAG_IMMUTABLE;
|
||||||
|
// }
|
||||||
|
return PendingIntent.getActivity(
|
||||||
|
mContext,
|
||||||
|
0,
|
||||||
|
intent,
|
||||||
|
flags
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -18,14 +18,15 @@ import android.media.RingtoneManager;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.RemoteViews;
|
import android.widget.RemoteViews;
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
import cc.winboll.studio.powerbell.MainActivity;
|
import cc.winboll.studio.powerbell.MainActivity;
|
||||||
import cc.winboll.studio.powerbell.R;
|
import cc.winboll.studio.powerbell.R;
|
||||||
import cc.winboll.studio.powerbell.beans.NotificationMessage;
|
import cc.winboll.studio.powerbell.beans.NotificationMessage;
|
||||||
import cc.winboll.studio.powerbell.services.ControlCenterService;
|
import cc.winboll.studio.powerbell.services.ControlCenterService;
|
||||||
|
|
||||||
public class NotificationUtils {
|
public class NotificationUtils2 {
|
||||||
|
|
||||||
public static final String TAG = NotificationUtils.class.getSimpleName();
|
public static final String TAG = NotificationHelper.class.getSimpleName();
|
||||||
|
|
||||||
Context mContext;
|
Context mContext;
|
||||||
NotificationManager mNotificationManager;
|
NotificationManager mNotificationManager;
|
||||||
@@ -45,19 +46,53 @@ public class NotificationUtils {
|
|||||||
private static String _mszChannelIDRemind = "2";
|
private static String _mszChannelIDRemind = "2";
|
||||||
private static String _mszChannelNameRemind = "Remind";
|
private static String _mszChannelNameRemind = "Remind";
|
||||||
|
|
||||||
public NotificationUtils(Context context) {
|
// public NotificationUtils(Context context) {
|
||||||
|
// mContext = context;
|
||||||
|
// mNotificationManager = (NotificationManager) context.getSystemService(
|
||||||
|
// Context.NOTIFICATION_SERVICE);
|
||||||
|
// }
|
||||||
|
|
||||||
|
public NotificationUtils2(Context context) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mNotificationManager = (NotificationManager) context.getSystemService(
|
mNotificationManager = context.getSystemService(NotificationManager.class);
|
||||||
Context.NOTIFICATION_SERVICE);
|
//createNotificationChannels();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void createNotificationChannel() {
|
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||||
NotificationChannel channel1 = new NotificationChannel(_mszChannelIDService, _mszChannelNameService, NotificationManager.IMPORTANCE_DEFAULT);
|
public void createNotificationChannels() {
|
||||||
channel1.setSound(null, null);
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
mNotificationManager.createNotificationChannel(channel1);
|
createServiceChannel();
|
||||||
NotificationChannel channel2 = new NotificationChannel(_mszChannelIDRemind, _mszChannelNameRemind, NotificationManager.IMPORTANCE_HIGH);
|
createRemindChannel();
|
||||||
channel2.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE), Notification.AUDIO_ATTRIBUTES_DEFAULT);
|
}
|
||||||
mNotificationManager.createNotificationChannel(channel2);
|
}
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||||
|
private void createServiceChannel() {
|
||||||
|
NotificationChannel channel = new NotificationChannel(
|
||||||
|
_mszChannelIDService,
|
||||||
|
_mszChannelNameService,
|
||||||
|
NotificationManager.IMPORTANCE_LOW
|
||||||
|
);
|
||||||
|
channel.setDescription("Background service updates");
|
||||||
|
channel.setSound(null, null);
|
||||||
|
channel.enableVibration(false);
|
||||||
|
mNotificationManager.createNotificationChannel(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||||
|
private void createRemindChannel() {
|
||||||
|
NotificationChannel channel = new NotificationChannel(
|
||||||
|
_mszChannelIDRemind,
|
||||||
|
_mszChannelNameRemind,
|
||||||
|
NotificationManager.IMPORTANCE_HIGH
|
||||||
|
);
|
||||||
|
channel.setDescription("Critical reminders");
|
||||||
|
channel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM), null);
|
||||||
|
channel.enableVibration(true);
|
||||||
|
channel.setVibrationPattern(new long[]{100, 200, 300, 400});
|
||||||
|
channel.setBypassDnd(true);
|
||||||
|
channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
|
||||||
|
mNotificationManager.createNotificationChannel(channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建并发送服务通知
|
// 创建并发送服务通知
|
||||||
11
powerbell/src/main/res/layout/custom_notification.xml
Normal file
11
powerbell/src/main/res/layout/custom_notification.xml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/ll_notification">
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/ll_notification">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Text"
|
||||||
|
android:id="@+id/info_tv"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
Reference in New Issue
Block a user