
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
春节不停更,此文正在参加「星光计划-春节更帖活动」
Java
的,所以好像也没怎么用vscode,而且vscode确实比较轻量级,比较符合我自己的需求吧,这里还是给大家一句话,符合自己的需求就好,不要给自己创造需求,下面我就以上下年这种给大家正式总结一下我的2021年吧,写帖子也不是特别多,所以大家也谅解一下哈:neutral_face:Java
一个起步阶段,然后真是白天上完课,晚上就在那里整Java
,真的是每天都要12点才能上床睡觉。Java
的常用类库的方法都不是特别熟悉的人,跑去参加了省赛,结果当然是被吊打了,只拿到了省三的水平。Java
的基础知识了,后面也是越学越快,过了一些前端的基础之后,开始跟着视频做了一个管理系统,不过说实话完,做完之后,做的时候还算能跟得上吧,不过基础知识不扎实,也导致我后面就想不起来了,很多地方都很粗略,如果有小伙伴想学后端,介意还是要打好基础,不然后面还是要补Java
语言描述,也是同时复习了我的基础知识,多磨几遍,果然是每次感悟都不一样),想在2022年取得更好的成绩吧这也是我第一次写年终总结,不过写着写着,发现自己这一年还是做了很多事情(当然了,篇幅有限,其实还是有很多是没有写上),不过确实年终的总结让我回想了很多,也是让我知道了我需要学习的很有很多,我要走的路还有很长。:confused:
在这里,我也希望2022年,我可以继续保持对编程的热爱,可以保持初心,努力前行,在HarmonyOS开发者创新大赛和蓝桥杯中取得更好的成绩!:laughing::laughing::laughing:
其实在过去我制作过一个关于鸿蒙设备迁移的简单一个项目简易计算器,由于篇幅的问题,很多详细的注释,我都有写在代码中,这个项目本身其实比较简单,大家可以重点关于我应用迁移,不过这个代码是我当时接触到鸿蒙的第一个项目,本身其实没有那么精妙绝伦,但是我希望大家可以在里面看到很多关于鸿蒙开发的一些感悟吧!
基本功能
迁移功能:
public class DeviceProvider extends BaseItemProvider {
List<DeviceInfo> list;
//获取设备在线信息列表
AbilitySlice slice;
//需要跳转的slcie
public DeviceProvider(List<DeviceInfo> list, AbilitySlice slice) {
this.list = list;
this.slice = slice;
}
@Override
public int getCount() {
if (list!=null){
return list.size();
}
return 0;
}
@Override
public Object getItem(int i) {
if(list!=null){
return list.get(i);
}
return null;
}
@Override
public long getItemId(int i) {
return i;
}
//把数据根据i放到item_device
@Override
public Component getComponent(int i, Component component, ComponentContainer componentContainer) {
Component cpt = LayoutScatter.getInstance(slice).parse(ResourceTable.Layout_item_device,null,false);
Text nameText = (Text)cpt.findComponentById(ResourceTable.Id_item_device_name);
nameText.setText(list.get(i).getDeviceName());
return cpt;
}
}
DeviceProvider类主要就是一会,我们项目中,要发起设备协同的时候,弹出框中的一些内容,注意,我们在这个地方要继承BaseItemProvider这个类,然后去实现的getCount() 、 getItem()、getItemId()、getComponent()方法;
//这里首先因为CalculateSlice作为一个AbilitySlice,所以要先继承AbilitySlice,
//然后因为我们后面要进行应用的迁移所以还要实现IAbilityContinuation接口-》》》
//为了实现onStartContinuation()、onSaveData()、onRestoreData()、onCompleteContinuation()方法
public class CalculateSlice extends AbilitySlice implements IAbilityContinuation {
private int a;
private int b;
private int result;
private String flag;
//这里我先给大家卖个关子,我这里为什么要声明为全局的四个参数,四个参数的意义我已经在之前CalculationFormula类表述过,这里不多赘述
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_calculate_main);
initContainer();
//initContainer()方法是为了初始化我们页面
Button transButton = (Button) findComponentById(ResourceTable.Id_calculate_trans);
//这里我们获取到了迁移这个按钮,并且为这个按钮添加了点击的事件
transButton.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
requestPermissions();
//系统对话框
CommonDialog commonDialog = new CommonDialog(CalculateSlice.this);
Utils.logInfo("trans 点击");
//设备listcontainer
ListContainer deviceListContainer = new ListContainer(CalculateSlice.this);
//获取在线设备的集合
List<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
DeviceProvider deviceProvider = new DeviceProvider(deviceInfoList, CalculateSlice.this);
deviceListContainer.setItemProvider(deviceProvider);
deviceListContainer.setItemClickedListener((listContainer, component1, position, id) -> {
DeviceInfo deviceInfo = deviceInfoList.get(position);
Utils.logInfo("设备名:" + deviceInfo.getDeviceName());
Utils.logInfo("设备id:" + deviceInfo.getDeviceId());
//连接其他手机的服务
Intent intentConn = new Intent();
//窗口取消
commonDialog.destroy();
continueAbility(deviceInfo.getDeviceId());
});
//设置大小
commonDialog.setSize(1000, 800);
//设置标题
commonDialog.setTitleText("设备列表");
//放入listcontainer
commonDialog.setContentCustomComponent(deviceListContainer);
//显示
commonDialog.show();
}
});
}
//这里是一个动态的权限的获取,这个模板我们可以自己套用,只要更改permission[]数组里面的权限参数就好了这里补充一下,我们这里的二个参数为动态获取的参数
private void requestPermissions() {
String[] permission = {
"ohos.permission.DISTRIBUTED_DATASYNC",
"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"};
List<String> applyPermissions = new ArrayList<>();
for (String element : permission) {
if (verifySelfPermission(element) != 0) {
if (canRequestPermission(element)) {
applyPermissions.add(element);
} else {
}
} else {
}
}
requestPermissionsFromUser(applyPermissions.toArray(new String[0]), 0);
}
void initContainer() {
//这里我声明一下,原本我是打算formula作为一个list去使用的,每次能自定义选择做几道题目的
//但是由于时间上的问题,所以没能做出,所以在这里使用formula可能稍显奇怪
//感兴趣的小伙伴可以尝试一下,毕竟我也不知道会遇到什么奇奇怪怪的问题
CalculationFormula formula = new CalculationFormula();
Random random = new Random();
Integer A = random.nextInt(100);
Integer B = random.nextInt(100);
formula.setA(A);
formula.setB(B);
a=A;
b=B;
String symbol[] = {"-", "+"};
int flagNum = random.nextInt(1);
formula.setFlag(symbol[flagNum]);
//这里简单就是为数字和符号生成随机的,这里我们使用了Java的random,不过听说大家好像更加流行用时间作为随机种子
flag=symbol[flagNum];
{
if (flagNum == 0) {
formula.setResult(A - B);
result=a-b;
} else {
formula.setResult(A + B);
result=a+b;
}
}
//这里就是根据了符号不同,然后去计算result的值,并且存入formula对象
//这里就是我们数字计算的UI了,这里我采用了开源组件 BabushkaText
//gitee地址:https://gitee.com/archermind-ti/BabushkaText
BabushkaText babushka = (BabushkaText)findComponentById(ResourceTable.Id_calculate_main_baText);
babushka.addPiece(new BabushkaText.Piece.Builder(String.valueOf(A))
.textColor(Color.getIntColor("#0081E2"))
.textSizeRelative(2f)
.build());
babushka.addPiece(new BabushkaText.Piece.Builder(symbol[flagNum])
.textColor(Color.getIntColor("#969696"))
.textSizeRelative(2f)
.build());
babushka.addPiece(new BabushkaText.Piece.Builder(String.valueOf(B) )
.textColor(Color.getIntColor("#0081E2"))
.textSizeRelative(2f)
.build());
babushka.addPiece(new BabushkaText.Piece.Builder("=")
.textColor(Color.getIntColor("#969696"))
.textSizeRelative(2f)
.build());
babushka.display();
TextField textFieldResult = (TextField) findComponentById(ResourceTable.Id_calculate_result);
Button buttonMain = (Button) findComponentById(ResourceTable.Id_calculate_put);
buttonMain.setText("提交");
//这里是获取了提交这个按钮,并且为按钮添加了点击事件
buttonMain.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
Utils.logInfo(String.valueOf(formula.getResult()));
Intent intent = new Intent();
String ok;
//这里就是我们把输入框中的答案和我们的result进行比较,注意我们这里是string类型的,使用要进行转换
if (textFieldResult.getText().equals(String.valueOf(formula.getResult()))) {
ok = "恭喜你,答对了,你太棒了!<( ̄︶ ̄)>";
Utils.logInfo(ok);
} else {
ok = "对不起,你回答错误了!再看一下下吧 ╮( ̄﹏ ̄)╭";
Utils.logInfo(ok);
}
//在这里我们把A,B,result,flag,ok,进行封装,因为我们一会要把这个数据传递给ResultSlice
intent.setParam("A", formula.getA());
intent.setParam("B", formula.getB());
intent.setParam("result", formula.getResult());
intent.setParam("flag", formula.getFlag());
intent.setParam("ok", ok);
//这里我们开始启动了一个新的ResultSlice
present(new ResultSlice(), intent);
}
});
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
//这里是我们迁移的方法,这是在开始连接的时候要进行的操作,这里我们直接返回true就好
@Override
public boolean onStartContinuation() {
return true;
}
/*这个方法是在传递的时候保存我们要传递的数据的方法
这里也就是为什么我前面提到的为什么要生成全局的变量的地方,但是大家注意看我下面把代码注释掉了
因为一开始我想做的是,在应用流转的时候,可以流转之后还是原来的数据,我也就是在这里踩坑了
onRestoreData()这个方法会在我们应用迁移的onstart()方法之前被调用
然后我在之后又启用initContainer()方法,导致了我的数据又被重新覆盖了,所以最后没实现,有想到好的解决的小伙伴也可以在评论区告诉我
*/
@Override
public boolean onSaveData(IntentParams intentParams) {
// intentParams.setParam("A", a);
// intentParams.setParam("B", b);
// intentParams.setParam("result", result);
// intentParams.setParam("flag", flag);
// Utils.logInfo(flag);
return true;
}
//这里就是我们应用迁移到新的设备之后进行拆箱
@Override
public boolean onRestoreData(IntentParams intentParams) {
// a = (int) intentParams.getParam("A");
// b = (int) intentParams.getParam("B");
// result = (int) intentParams.getParam("result");
// flag = (String) intentParams.getParam("flag");
// Utils.logInfo(String.valueOf(a));
// Utils.logInfo(String.valueOf(b));
return true;
}
//这里是我们应用迁移完成之后要执行的方法,这里我们执行terminate()方法,在迁移的设备上退出CalculateSlice
@Override
public void onCompleteContinuation(int i) {
terminate();
}
}
CalculateSlice类:就是我们这个项目的主要内容了,我们在这里实现了迁移,计算练习的显示,还有提交按钮的显示
public class ResultSlice extends AbilitySlice {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_calculate_result);
int a=intent.getIntParam("A",0);
int b=intent.getIntParam("B",0);
int result=intent.getIntParam("result",0);
String flag = intent.getStringParam("flag");
String ok = intent.getStringParam("ok");
//这里我们主要进行对CalculateSlice传递过来的A、B、result、flag、ok参数进行拆箱
Text mainText=(Text)findComponentById(ResourceTable.Id_calculate_result_main);
mainText.setText(String.valueOf(a)+flag+ String.valueOf(b)+"="+result);
Text resultText=(Text)findComponentById(ResourceTable.Id_calculate_result);
resultText.setText(ok);
//然后进行我们的算式的显示
//下面这个就是我们通过一个nextCalButton拉起一个新的CalculateSlice,进行下一题的计算了
Button nextCalButton=(Button)findComponentById(ResourceTable.Id_calculate_nextCal);
nextCalButton.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
Intent intent1 = new Intent();
Operation operation=new Intent.OperationBuilder()
.withAction("action.intent.CalculateSlice")
.build();
intent1.setOperation(operation);
startAbility(intent1);
}
});
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
ResultSlice类:主要就是对我们计算结果页面的一个显示、和我们进行一下一个题目功能的实现