假设你要设计一款帮助学龄儿童学习加减法运算的手机APP,请为这款APP设定三个不同类型的人物角色,分别描述他们的特征
一、数学小精灵
数学小精灵是一个非常可爱的小精灵,他身穿一件颜色鲜艳的衣服,头戴一顶尖尖的帽子。他有着非常深厚的数学知识和技能,可以向孩子们展示一些有趣的数学游戏和实验,可以让孩子们在玩乐中学习数学。
数学小精灵的外表非常可爱,他的衣服和帽子都是非常鲜艳的颜色,可以吸引小朋友的注意力。他的性格非常友好和亲切,可以和小朋友们玩耍和交流。他的数学能力非常强,可以向小朋友们介绍各种有趣的数学知识和概念,同时还可以教他们一些数学技巧和方法,让他们更容易地学习数学。
数学小精灵非常善于发现孩子们的潜力和兴趣,可以根据孩子们的兴趣和特点,设计出适合他们的数学游戏和实验。他可以用一些生动的例子和实际的场景来帮助孩子们理解数学概念,让孩子们在轻松愉悦的氛围中学习数学。
二、数学大侠
数学大侠是一个穿着盔甲的数学英雄,手持一把剑。他非常勇敢和聪明,善于解决各种数学难题。他可以教孩子们一些数学技巧和方法,让他们更轻松地学习数学。
数学大侠的外表非常帅气和霸气,他穿着盔甲和手持剑,可以吸引小朋友的注意力。他的性格非常勇敢和聪明,可以帮助小朋友们解决各种数学难题。他的数学能力非常强,可以向小朋友们介绍各种数学知识和概念,同时还可以教他们一些数学技巧和方法,让他们更容易地学习数学。
数学大侠非常善于挑战孩子们的数学能力,可以设计一些有趣的数学问题和难题,让孩子们在解决问题的过程中学习数学知识。他可以用一些生动的例子和实际的场景来帮助孩子们理解数学概念,让孩子们在挑战和创造的过程中学习数学。
三、数学超人
数学超人是一位拥有超能力的超人,可以飞行和使用各种魔法。他非常聪明和有趣,可以用他的超能力来帮助孩子们学习数学。他可以向孩子们介绍各种有趣的数学概念和知识,让他们在轻松有趣的氛围中学习数学。
数学超人的外表非常酷炫和神秘,他可以飞行和使用各种魔法,可以吸引小朋友的注意力。他的性格非常聪明和有趣,可以帮助小朋友们学习数学知识和技能。他的数学能力非常强,可以向小朋友们介绍各种数学知识和概念,同时还可以教他们一些数学技巧和方法,让他们更容易地学习数学。
数学超人非常善于创造有趣的数学场景和故事,可以让孩子们在游戏中学习数学。他可以用一些生动的例子和实际的场景来帮助孩子们理解数学概念,让孩子们在游戏和创造的过程中学习数学。
总之,数学小精灵、数学大侠和数学超人三个人物角色,都是非常适合小朋友的,他们的外表、性格和数学能力都可以吸引小朋友的注意力和兴趣,让小朋友们在轻松愉悦的氛围中学习数学。
为了方便操作就把开关做成了一个小组件样式,可以随意拖放到桌面上,解决频繁切换应用的麻烦。
package cn.qsub.smarthome;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RemoteViews;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Implementation of App Widget functionality.
*/
public class NewAppWidget extends AppWidgetProvider {
//定义一个action,这个action要在AndroidMainfest中去定义,不然识别不到,名字是自定义的
private static final String CLICK_ACTION = "cn.qsub.smarthome.CLICK";
private static final String CLICK_ACTION2 = "cn.qsub.smarthome.CLICK2";
//服务器地址
public static final String HOST = "8.142.9.82";
//服务器端口号
public static final int PORT = 1112;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
super.onUpdate(context, appWidgetManager, appWidgetIds);
Log.e("===>", "11");
for (int appWidgetId : appWidgetIds) {
//创建一个远程view,绑定我们要操控的widget布局文件
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
Intent intentClick = new Intent();
//这个必须要设置,不然点击效果会无效
intentClick.setClass(context, NewAppWidget.class);
intentClick.setAction(CLICK_ACTION);
//PendingIntent表示的是一种即将发生的意图,区别于Intent它不是立即会发生的
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentClick, PendingIntent.FLAG_UPDATE_CURRENT);
//为布局文件中的按钮设置点击监听
remoteViews.setOnClickPendingIntent(R.id.smartLamp, pendingIntent);
Intent intentClick2 = new Intent();
//这个必须要设置,不然点击效果会无效
intentClick2.setClass(context, NewAppWidget.class);
intentClick2.setAction(CLICK_ACTION2);
//PendingIntent表示的是一种即将发生的意图,区别于Intent它不是立即会发生的
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, intentClick2, PendingIntent.FLAG_UPDATE_CURRENT);
//为布局文件中的按钮设置点击监听
remoteViews.setOnClickPendingIntent(R.id.smartLampOff, pendingIntent2);
//告诉AppWidgetManager对当前应用程序小部件执行更新
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
}
}
//onReceive不存在widget生命周期中,它是用来接收广播,通知全局的
private Context context = null;
/**
* 接收窗口小部件点击时发送的广播
*
* @param contexts
* @param intent
*/
@Override
public void onReceive(final Context contexts, Intent intent) {
System.out.println("111");
super.onReceive(contexts, intent);
//当我们点击桌面上的widget按钮(这个按钮我们在onUpdate中已经为它设置了监听),widget就会发送广播
//这个广播我们也在onUpdate中为它设置好了意图,设置了action,在这里我们接收到对应的action并做相应处理
context = contexts;
if (intent.getAction().equals(CLICK_ACTION)) {
// //因为点击按钮后要对布局中的文本进行更新,所以需要创建一个远程view
Toast.makeText(context, "早~", Toast.LENGTH_LONG).show();
Thread Thread = new Thread(new Runnable() {
@Override
public void run() {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
System.out.println("11122");
Socket socket = null;
try {
//创建一个流套接字并将其连接到指定主机上的指定端口号
socket = new Socket(HOST, PORT);
//读取服务器端数据
DataInputStream input = new DataInputStream(socket.getInputStream());
//向服务器端发送数据
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// 开灯
out.writeUTF("1");
remoteViews.setInt(R.id.smartLamp, "setBackgroundResource", R.color.tm);
remoteViews.setInt(R.id.smartLampOff, "setBackgroundResource", R.drawable.moon);
out.close();
input.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
System.out.println("socket is closed");
} catch (IOException e) {
socket = null;
System.out.println("客户端 finally 异常:" + e.getMessage());
}
}
}
//更新widget
appWidgetManager.updateAppWidget(new ComponentName(context, NewAppWidget.class), remoteViews);
}
});
Thread.start();
}else if (intent.getAction().equals(CLICK_ACTION2)){
Toast.makeText(context, "晚安", Toast.LENGTH_LONG).show();
Thread Thread = new Thread(new Runnable() {
@Override
public void run() {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
System.out.println("111");
Socket socket = null;
try {
//创建一个流套接字并将其连接到指定主机上的指定端口号
socket = new Socket(HOST, PORT);
//读取服务器端数据
DataInputStream input = new DataInputStream(socket.getInputStream());
//向服务器端发送数据
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// 开灯
out.writeUTF("0");
remoteViews.setInt(R.id.smartLampOff, "setBackgroundResource", R.color.tm);
remoteViews.setInt(R.id.smartLamp, "setBackgroundResource", R.drawable.sun);
out.close();
input.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
System.out.println("socket is closed");
} catch (IOException e) {
socket = null;
System.out.println("客户端 finally 异常:" + e.getMessage());
}
}
}
//更新widget
appWidgetManager.updateAppWidget(new ComponentName(context, NewAppWidget.class), remoteViews);
}
});
Thread.start();
}
}
@Override
public void onEnabled(Context context) {
Log.e("===>", "33");
// Enter relevant functionality for when the first widget is created
}
@Override
public void onDisabled(Context context) {
Log.e("===>", "44");
// Enter relevant functionality for when the last widget is disabled
}
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
Log.e("===>", "55");
// CharSequence widgetText = context.getString(R.string.appwidget_text);
// Construct the RemoteViews object
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
// views.setTextViewText(R.id.smartLamp, widgetText);
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.qsub.smarthome" >
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<receiver android:name=".NewAppWidget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<!--这个和SimpleWidgetProvider中的CLICK_ACTION对应-->
<action android:name="cn.qsub.smarthome.CLICK"/>
<action android:name="cn.qsub.smarthome.CLICK2"/>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/new_app_widget_info" />
</receiver>
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>