一、快捷方式
1、静态创建:主要是xml
(1)、在项目res目录下新建xml包,在xml目录下新建自定义名称的xml文件,内容参考如下:
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<!--1、shortcut节点可建多个,但系统最多只会显示4或5个-->
//shortcut参数:
//enabled:可选、是否启用此快捷方式 ,默认false,
//当设为true运行后且拖拽此快捷方式到桌面后,把此值删除或改为false,再次运行,桌面的快捷方式会置灰,长按后不再显示此快捷方式选项
// icon:可选、快捷方式的图标
//shortcutId:必选、快捷方式的id,必须是唯一的且不能引用资源库
//shortcutShortLabel:必选、快捷方式的短名称,10个字符串以内且必须为资源文件strings引用,在长名称显示不下或者没有长名称的时候显示
//shortcutLongLabel:可选、快捷方式的短名称,25个字符以内且必须为资源文件strings引用,会优先显示长名称
//shortcutDisabledMessage:可选、当此快捷被禁用,也就是快捷方式置灰时被点击了,吐司的提示信息,必须为资源文件strings引用
//intent参数:
//action:指定Intent要启动的操作或任务,该属性必须要指定,否则不会显示快捷方式。
//targetClass:要跳转的目标类。
// targetPackage:要跳转的目标应用包名。
<shortcut
android:enabled="true"
android:icon="@mipmap/aa"
android:shortcutDisabledMessage="@string/shortcut_disabled_message"
android:shortcutId="iddddd1"
android:shortcutLongLabel="@string/shortcut_long_label"
android:shortcutShortLabel="@string/shortcut_short_label">
<intent
android:action="com.dashingqi.shortcut.Back"
android:targetClass="com.mo.shortcutsdemo.StaticStateActivity"
android:targetPackage="com.mo.shortcutsdemo" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
</shortcuts>
2、动态创建:主要是代码,如下
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
// android 7.1
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
Intent intent =new Intent(this, DynamicActivity.class);
intent.setAction(Intent.ACTION_VIEW);
ShortcutInfo shortcutInfo =new ShortcutInfo.Builder(this, "id1")
.setShortLabel("动态短标签")
.setLongLabel("动态长标签")
.setIcon(Icon.createWithResource(this, R.mipmap.aa))
// .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com")))
.setIntent(intent)
.build();
//ShortcutInfo 可new多个实例
shortcutManager.setDynamicShortcuts(Arrays.asList(shortcutInfo));
}
3、固态创建快捷方式:就是在程序里由代码控制直接在桌面添加一个快捷方式,不会在APP图标长按的操作里显示
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
if (shortcutManager.isRequestPinShortcutSupported()){//系统是否支持
Intent intent =new Intent(MainActivity.this, FixedActivity.class);//快捷方式点击后去哪
intent.setAction(Intent.ACTION_VIEW);//必须:不然跳不动
ShortcutInfo shortcutInfo =new ShortcutInfo.Builder(MainActivity.this, "id2")
.setShortLabel("固态短标签")
.setLongLabel("固态长标签")
.setIcon(Icon.createWithResource(MainActivity.this, R.mipmap.aa))
// .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com")))
.setIntent(intent)
.build();
//添加跳转意图
Intent pinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(shortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(MainActivity.this, 0, pinnedShortcutCallbackIntent, 0);
shortcutManager.requestPinShortcut(shortcutInfo,successCallback.getIntentSender());
}
}
二、桌面小部件:
1、小部件添加到桌面时的显示样式-xml,如:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="@mipmap/ic_launcher"
android:layout_height="match_parent">
<TextView
android:id="@+id/appwidget_text"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:layout_height="wrap_content"
android:text="小部件" />
</FrameLayout>
2、自定义继承AppWidgetProvider的类
/**
* @ author:mo
* @ data:2021/7/28:10:21
* @ 功能:
*/
public class MyAppWidgetextends AppWidgetProvider{
/**接收窗口小部件点击时发送的广播 */
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
//添加到桌面后对显示视图内容修改
CharSequence widgetText ="小部件快捷方式";
RemoteViews views =new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
views.setTextViewText(R.id.appwidget_text, widgetText);
//点击事件添加
Intent intent =new Intent(context, WidgetActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.appwidget_text, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
/** 每次窗口小部件被更新都调用一次该方法*/
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
Log.i("MyAppWidget", "开始了更新");
for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
/**每删除一次窗口小部件就调用一次 */
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
//context.stopService(new Intent(context, WidgetService.class));
Log.i("MyAppWidget", "删除成功!");
}
/**当该窗口小部件第一次添加到桌面时调用该方法 */
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
// Intent mTimerIntent = new Intent(context, WidgetService.class);
Log.i("MyAppWidget", "创建成功!");
}
/**当最后一个该窗口小部件删除时调用该方法 */
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
// Intent mTimerIntent = new Intent(context, WidgetService.class);
// context.stopService(mTimerIntent);
Log.i("AppWidget", "删除成功!");
}
/** 当小部件大小改变时*/
@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
}
/** 当小部件从备份恢复时调用该方法*/
@Override
public void onRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds) {
super.onRestored(context, oldWidgetIds, newWidgetIds);
}
}
3、添加配置信息
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/new_app_widget"
android:minHeight="80dp"
android:minWidth="80dp"
android:previewImage="@mipmap/aa"
android:updatePeriodMillis="1200001"
android:widgetCategory="home_screen|keyguard">
</appwidget-provider>
<!--initialLayout: 初始化布局-->
<!--minHeight/minWidth: 宽高 40dp等于一个-->
<!--previewImage: 选择添加小部件时,小部件的图标-->
<!--updatePeriodMillis: 数据更新周期,单位毫秒,起步为30分钟-->
<!--resizeMode: 调整大小模式也就是拉伸模式-->
4、清单里进行注册
<receiver android:name=".MyAppWidget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/my_app_widget_info" />
</receiver>