精华内容
下载资源
问答
  • 软件开发备忘录

    2019-10-04 11:18:24
    软件开发备忘录 引子 立项 开发 收尾 引子  最近郑州天气慢慢的变暖和了,心情也有点受天气的影响,烦躁的很。这几天,又有技术支持和销售的同事在“缺陷管理系统”给我的XX系统提了几个“建设性”的改进意见。...

    软件开发备忘录


    1. 引子
    2. 立项
    3. 开发
    4. 收尾

    引子

      最近郑州天气慢慢的变暖和了,心情也有点受天气的影响,烦躁的很。这几天,又有技术支持和销售的同事在“缺陷管理系统”给我的XX系统提了几个“建设性”的改进意见。我当时看到那几条所谓的意见之后,真真的是There's a fire starting in my heart了。并不是我听不得别人的意见,只是写这个项目有太多让我憋屈的事了。就像你大学四年为心爱的女生送早餐、占座,可是在大四的时候她却告诉你说“我不喜欢你,因为你不帅。” WTF ! ! !

      这个系统是我进公司以来独立完成的第二个项目,是从去年六七月开始做一个关于旧系统的重写。不过现在看来,那时候的重写不过是换套页面罢了,对于系统中存在的易用性和稳定性并没有多大的提高。后来在开发的过程中,在计划之外的时间和加班时间加入WebSocket通讯机制,从根本上改变了系统的可用性和稳定性。同时在前台页面中大量使用Ajax的方式通讯和通过JavaScript加载页面布局的方式替换之前系统大量使用Asp.net控件和后台代码彻底解决了系统加载速度慢和可用性低的各种问题。总之,在这个系统中投入了我很多的心血,现将在系统开发中遇到的问题和想法一并记录下来,算是对自己这一年以来的交代。

    立项

      立项,在我看来是一个软件的重中之重。在立项过程中,我们有几点一定要确立好。正所谓“磨刀不误砍柴工”,如果一个软件的立项没有做好,想在后期通过项目成员的超神发挥把项目做好几乎是不可能的。首先我们要确定的是关于软件的几个基本要素:

    1. 当前软件要解决什么问题
    2. 软件的使用场景
    3. 软件的使用人员
      这几个条件看着貌似并不苛刻,可是在我们做项目中却很少有人能严格执行。之前做过一个项目关于气体行业的ERP,其实就是个很简单的供销软件。可后来在开发的过程中,因为客户的需求,就加入了各种模式的供销模式,再后来加OA,最后各种乱七八糟的管理系统也集成了进来。最终成了一个“巨无霸”的软件,按说这种要什么功能有什么功能的软件应该很好用的。可事实是:功能多而无用,一个工厂的供销模型一般都有很大的差异,关于报表的统计就更加的有差异化了。可是我们的报表为了兼容多种业务模式就显示了很多无用的数据,最终的结果就是很多人用的都不爽。再到后来这个软件就是bug比功能都多,客户不想用,开发人员不想开发。

    明确软件的使用场景和使用人员对于后期功能的开发能够更加明确,避免软件使用性不高和关于功能的把控不足、不能精准的解决用户的需求或者过度开发某项产出不高的功能。

    开发

    1. 开发打好提前量
    2. 开发人员协调
    3. 联合调试

    开发过程中一些基础性的东西一定要提前确定好不然真的是要死人的。这次重写这个系统让我蛋疼的就是页面了,来来回回换了三四回。其实,在我看来这几套页面并没有多么好看或者有辨识度,跟思聪哥的女朋友一样:看着确实不一样,但是仔细一看都差不多。就因为倒腾这几个破页面,有段时间右手的食指根本都弯曲不了。

    还有就是开发成员的组成了,开发这个系统由两部分的人员组成。一部分是C++,主要负责客户端的开发。我主要开发Web端的数据交互和数据展示。这个系统的主要一部分就是还得要跟他们有接口交互,关于这个接口其中设计到了一个加密的模块。当时的情况是:客户端不懂服务端的开发模式,服务端不懂客户端的开发模式。客户端加密之后的数据只管往服务器扔,其他的就都不管了。其实,当时我的程序跟客户端之间还有一个IIS服务器,有些请求根本就是IIS拒绝掉了或者自动处理掉。可是他们当时并不知道,而我也不了解他们c++,也不知道具体问题出在哪里或者应该怎么改进当前的加密方式。就因为这个加密的问题,当时耽误了有两周时间多,双方都闹的很不愉快。出现这样的情况,很大的原因要归于没有一个真正的技术带头人或者决策者。都是两个愚蠢且爆炸的程序员在言语的嘶吼和心中的谩骂中一步一步的熬出来的,当时如果有个真正的决策者。确定研究的方向:到底是客户端服从服务端还是服务端服从客户端?我想就算刚开始的研究方向是错误的,最终也会解决问题的,而不会像这样在撕逼中完成工作。

    联合调试是这个项目必不可少的部分了。可以说,这个部分出现的问题最多,也最明显,也更容易改正。比如,两个人工作进度不一致导致不能同时联调,或者客户端没有正确的响应等。不过,联合调试的时候出现的问题很明显,也很直接。很多问题几乎就是只出现一次,以后就很很好的避免。联合调试中重要的就是开发人员要保持良好的心态和正确的沟通方式。也是程序员最欠缺的与人打交道的正确方式。

    收尾

    现在这套系统已经做完了,剩下的基本就是功能的维护和改进。通过这样的一个完整的项目开发周期,踩过了很多的坑。有自己的开发模式上的、有与人协调上的。也学到了很多技术上的知识,与人沟通交流的方式方法、在联合开发中的正确甩锅姿势。年纪大了,有些东西不记录下来就容易忘记。本来有好多东西要说的,现在实在是憋不出来。先记录这么多吧

    2017-06-03

    转载于:https://www.cnblogs.com/jswjia/p/6938217.html

    展开全文
  • 软件实施备忘录.docx

    2020-05-12 09:16:36
    软件实施备忘录--在IT行业,特别是管理软件实施行业能够成为一个成功的项目经理是非常困难的一件事情,一个成功的IT经理,被要求熟悉计算机软硬件知识,精通企业业务背景,拥有良好的沟通技巧和说服能力,当然在项目...
  • 这是Android程序设计与开发(Android Studio版)课程的课程设计——“备忘录软件源代码。没有bug,保证符合课设要求,老师已验收过,成绩优秀。
  • 这是一个基于Android的手机备忘录软件设计,很有参考价值,有需要的志同者,不妨下载!
  • 主动降噪功能与TWS真无线耳机的结合,对于消费者来说可以提高使用体验。不过当前市面上的这类产品,在声音表现和降噪素质上都达到一定水平的,往往售价偏高,让一部分消费者望而却步,头戴式主动降噪耳机的价格更是...
  • Android备忘录软件设计

    2017-06-20 11:16:00
    Android备忘录软件设计
  • 这就是备忘录模式应用于游戏、文字处理等程序的软件设计中的方式,这些程序需要保存当前上下文的复杂状态的快照并在以后恢复。  备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并
  • Android 手机备忘 录的设计与实现开 题报告 1 2020 年 4 月 19 日 邵阳学院毕业设计论文任务书 年级专业 级通信工程 学生姓名 学 号 课题名称 Android 手机备忘录的设计与实现 设计 (论文 ) 11 月 15 日至 06 月 10 ...
  • 一个简单的语音备忘录demo, 录制 暂停 播放 语音 ,检测录音时的音量,本地保存 可删除
  • 如果您只是在学习一种编程语言,或者想找到一些使调试变得更容易的作弊技巧,我们为软件开发人员准备了30个备忘单和信息图表 。 请记住,每个链接都将带您到原始站点,您可以在其中查看备忘单或信息图的全部内容,...

    如果您只是在学习一种编程语言,或者想找到一些使调试变得更容易的作弊技巧,我们为软件开发人员准备30个备忘单和信息图表

    请记住,每个链接都将带您到原始站点,您可以在其中查看备忘单或信息图的全部内容,或以PDF格式下载。

    成为抢手的软件开发人员
    为什么软件开发人员应该原型
    十大编程语言
    十大编程语言
    多年来的编程语言
    计算机程序设计语言
    编程语言信息史
    Cpp11-Regex-备忘单
    Node.JS帮助表
    Java语法备忘单
    Java备忘单
    JavaScript备忘单
    C-参考卡-ANSI
    核心尖锐和网络快速参考
    Ruby备忘单
    Python-3-作弊表
    PHP备忘单
    Csharp编码标准
    Csharp备忘单和笔记
    重击
    JavaScript备忘单
    SVG备忘单
    jQuery的
    Vue-js
    React-js
    角度的
    RubyOnRails初学者速查表
    苗条的作弊表
    Git作弊表
    NPM纱线备忘单

    翻译自: https://www.hongkiat.com/blog/cheatsheet-infographic-software-developers/

    展开全文
  • iPhone开发入门系列2(iOS8+Swift版)备忘录APP学习01

    学习玩iPhone入门系列1(共有四个,234没有翻译版本)后,找到了The iOS Apprentice 3rd Edition全系列下载http://www.salttiger.com/the-ios-apprentice-3rd-edition/

    系列2是开发一款备忘录APP,先想一想要实现这一APP要做的(to-do-list)事务清单:
    我的思考,结合自己用过的备忘录功能,要实现的内容:

    1)主界面是一个备忘录的列表,罗列备忘事件标题,如生日,旅游,购物等,主要功能有添加事件,删除事件;

    2)主界面添加事件,进入下一页空白的文本编辑视图,编辑事件后保存返回;

    3)主界面删除事件;

    4)每个事件标题点击后能进入下一页视图,是一文本可编辑的视图,记录具体的要做的事情,可修改保存退出;

    5)时间提醒,备忘事件可以设置提醒的时间,提醒次数等。

    教程里备忘录APP的to-do-list:管理备忘项目表,已实现项目自动剔除,添加时间提醒,即便备忘录APP没有运行。

    先介绍iOS开发的两个主要UI:Table View 和 Navigation  Controller

    Table View:显示列表的,是备忘录APP的视图

    Navigation Controller: 处理视图层之间的移动切换关系,顶部有导航标题和返回按钮


    手机常见的通讯录,记事本,设置等等都用到了这两个UI。

    备忘录APP要实现的功能是显而易见的:



    展开全文
  • 基于Android开发备忘录软件(创建、通知)系统概述系统总体设计系统设计与实现部分关键代码及说明程序运行截图学习点 系统概述 结合本学期课程所学的关于Android通知的知识以及期中期末作业的记事本软件应用开发,...

    系统概述

    结合本学期课程所学的关于Android通知的知识以及期中期末作业的记事本软件应用开发,我在之前就有想法做一个将两者结合的应用即备忘录,既能记事又能提醒。
    具体定义为:具有备忘录的基本功能,支持备忘事项的创建,同时提供定时提醒功能(在指定的时间到达前在通知栏上弹出相应的通知来提醒用户)。

    系统总体设计

    系统设计图
    其中,删除用长按ListView实现,添加由点击按钮实现,编辑由点击ListView实现。闹钟提醒由广播通知实现。

    系统设计与实现部分

    关键代码及说明

    ①构造xml文件,使用ReclcyerView控件实现备忘录的列表显示,通过CardView控件实现备忘录的卡片式显示,以及添加FloatingActionButton控件进行添加活动的跳转。TextView和ImageView实现细节展示。

    (1)activity_main.xml(部分代码)

     <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="670dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="14dp"
            android:src="@drawable/ic_add"
            app:backgroundTint="#FF2229" />
    

    (2)activity_edit.xml(部分代码)

    <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp">
    
            <LinearLayout
                android:layout_width="275dp"
                android:layout_height="122dp"
                android:layout_weight="5"
                android:orientation="vertical">
    
                <LinearLayout
                    android:layout_width="289dp"
                    android:layout_height="59dp"
                    android:orientation="horizontal">
    
                    <TextView
                        android:id="@+id/dateText"
                        android:layout_width="wrap_content"
                        android:layout_height="fill_parent"
                        android:text="现在是2020/1/1"
                        android:textAppearance="?android:attr/textAppearanceLarge"
                        android:textSize="25sp" />
    
                    <TextView
                        android:id="@+id/timeText"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dp"
                        android:text="00:00"
                        android:textAppearance="?android:attr/textAppearanceMedium"
                        android:textSize="25sp" />
                </LinearLayout>
    
                <TextView
                    android:id="@+id/alarmView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="5dp"
                    android:text="提醒时间:"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:textSize="25sp" />
    
            </LinearLayout>
    
            <ImageButton
                android:id="@+id/alarmButton"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:background="@drawable/alarm"
                android:onClick="setAlarm" />
        </LinearLayout>
    
    

    (3)note_card.xml(部分代码)

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="2dp"
        android:layout_marginTop="2dp">
    
    
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1">
    
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="22dp"
                android:layout_gravity="center_horizontal"
                android:padding="0dp"
                android:layout_margin="0dp"
                android:baselineAligned="false"
                android:layout_marginBottom="1dp">
    
                <TextView
                    android:id="@+id/textDate"
                    android:layout_width="118dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:gravity="left|center_vertical"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:textColor="#908d8d"
                    android:textSize="16sp"
                    android:typeface="sans" />
    
                <Space
                    android:layout_width="5dp"
                    android:layout_height="match_parent" />
    
                <TextView
                    android:id="@+id/textTime"
                    android:layout_width="105dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:gravity="left|center_vertical"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:textColor="#908d8d"
                    android:textSize="16sp"
                    android:typeface="sans" />
    
                <Space
                    android:layout_width="224dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" />
    
                <ImageView
                    android:id="@+id/alarm"
                    android:layout_width="40dp"
                    android:layout_height="match_parent"
                    android:layout_gravity="center"
                    android:layout_weight="0"
                    android:src="@drawable/alarm" />
            </LinearLayout>
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="58dp"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:id="@+id/mainText"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="5dp"
                android:textSize="16sp"
                android:typeface="sans"
                android:maxLines="2"
                android:ellipsize="end"
                android:lineSpacingMultiplier="1.2"/>
        </LinearLayout>
    </LinearLayout>
    
    

    ②编写Note.java,创建备忘录的实体类,通过get和set方法获取和传入对应属性值。

    public class Note {
    
        private int id;
        private int num;//列表中的位置
        private String textDate;
        private String textTime;
        private String alarm;
        private String mainText;
    
    
        public Note(){}
    
        public Note(int num, int tag, String textDate, String textTime, String alarm, String mainText, int id) {
            this.num = num;
            this.textDate = textDate;
            this.textTime = textTime;
            this.alarm = alarm;
            this.mainText = mainText;
            this.id = id;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
    
    

    ③编写列表适配器类NoteAdapter.java,通过ViewHolder进行数据缓存和快速设置列表中每一列的值。

    public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.ViewHolder> {
    
        private Context mContext;
        private List<OneNote> mNoteList;
    
        static class ViewHolder extends RecyclerView.ViewHolder {
            CardView cardView;
            ImageView tag;//cardview的标签图片
            ImageView alarm;//cardview的闹钟图片
            TextView mainText;//cardview的内容
            TextView textDate;//cardview的日期
            TextView textTime;//cardview的时间
    
            public ViewHolder(View view) {//view是RecyclerView子项(CardView)的最外层布局
                super(view);
                cardView = (CardView) view;
                alarm = (ImageView) view.findViewById(R.id.alarm);
                mainText = (TextView) view.findViewById(R.id.mainText);
                textDate = (TextView) view.findViewById(R.id.textDate);
                textTime = (TextView) view.findViewById(R.id.textTime);
            }
        }
    
        public NoteAdapter(List<OneNote> noteList) {
            mNoteList = noteList;
        }
    
        /**
         * 加载布局cardView,以及布局中的事件
         */
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            if (mContext == null) {
                mContext = parent.getContext();
            }
            View view = LayoutInflater.from(mContext).inflate(R.layout.note_card,
                    parent, false);
    
            return new ViewHolder(view);
        }
    
    
        /**
         * 对cardView的内容赋值
         */
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder,final int position) {
            final OneNote oneNote=mNoteList.get(position);
            holder.mainText.setText(oneNote.getMainText());
            holder.textDate.setText(oneNote.getTextDate());
            holder.textTime.setText(oneNote.getTextTime());
    
            if (oneNote.getAlarm()){
                //有提醒就设置显示
                holder.alarm.setVisibility(View.VISIBLE);
            }
            else {
                holder.alarm.setVisibility(View.GONE);
            }
    
            if (mItemClickListener!=null){
                holder.cardView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // 这里利用回调来给RecyclerView设置点击事件
                        mItemClickListener.onItemClick(position);
                    }
                });
            }
            if (mItemLongClickListener!=null){
                holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        // 这里利用回调来给RecyclerView设置长按事件
                        mItemLongClickListener.onItemLongClick(position);
                        return true;
                    }
                });
            }
    
    
        }
    
        @Override
        public int getItemCount() {
            return mNoteList.size();
        }
    
    
        /**
         * 定义接口
         */
        private ItemClickListener mItemClickListener;
        private ItemLongClickListener mItemLongClickListener;
        public interface ItemClickListener{
            public void onItemClick(int position);
        }
        public interface ItemLongClickListener{
            public boolean onItemLongClick(int position);
        }
        public void setOnItemClickListener(ItemClickListener itemClickListener){
            this.mItemClickListener=itemClickListener;
        }
        public void setOnItemLongClickListener(ItemLongClickListener itemLongClickListener){
            this.mItemLongClickListener=itemLongClickListener;
        }
    }
    
    

    ④编写主方法MainActivity.java,编写方法loadHistoryData加载已经存在的备忘录,创建NoteAdapter适配器对象adapter,并通过LinearLayoutManager设置布局管理器,从而完成页面布局显示。编写函数setOnItemLongClickListener实现对备忘录的删除,transportInformationToEdit对已有的备忘录的编辑。以及按钮的事件实现备忘录的添加,ListView里条目的点击事件(点击编辑),ListView里条目的长按事件(长按删除)。

    public class MainActivity extends AppCompatActivity {
    
        //list to store all the memo
        private List<OneNote> notelist=new ArrayList<>();
    
        //adapter
        NoteAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Toolbar main_toolbar=(Toolbar)findViewById(R.id.main_toolbar);
            setSupportActionBar(main_toolbar);
    
            //加载note
            loadHistoryData();
    
            //RecyclerView事件
            RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recycler_view);
            LinearLayoutManager layoutManager=new LinearLayoutManager(this);
            recyclerView.setLayoutManager(layoutManager);
            adapter=new NoteAdapter(notelist);
            recyclerView.setAdapter(adapter);
    
            adapter.setOnItemClickListener(new NoteAdapter.ItemClickListener() {
                @Override
                public void onItemClick(int position) {
                    Intent intent=new Intent(MainActivity.this,Edit.class);
                    Note record=getNoteWithNum(position);
                    //添加信息进intent
                    transportInformationToEdit(intent, record);
                    startActivityForResult(intent,position);
    
                }
            });
    
            adapter.setOnItemLongClickListener(new NoteAdapter.ItemLongClickListener() {
                @Override
                public boolean onItemLongClick(final int position) {
                    final AlertDialog.Builder dialog = new AlertDialog.Builder (MainActivity.
                            this);
                    dialog.setTitle("删除");
                    dialog.setMessage("是否删除?");
                    dialog.setCancelable(false);
                    dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            int n=notelist.size();
                            //如果这个备忘录有一个闹钟,取消它
                            if(notelist.get(position).getAlarm()) {
                                cancelAlarm(position);
                            }
                            notelist.remove(position);
                            adapter.notifyDataSetChanged();
    
                            String whereArgs = String.valueOf(position);
                            Uri uri = Uri.parse("content://com.example.note.provider/note" );
                            getContentResolver().delete(uri,"num = ?",new String[]{whereArgs});
    
                            for(int i=position+1; i<n; i++) {
                                ContentValues values = new ContentValues();
                                values.put("num", i-1);
                                String where = String.valueOf(i);
                                getContentResolver().update(uri, values, "num = ?", new String[]{where});
                                values.clear();
                            }
                        }
                    });
                    dialog.setNegativeButton("取消", new DialogInterface.
                            OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    });
                    dialog.show();
    
                    return true;
                }
            });
    
    
            FloatingActionButton addButton=(FloatingActionButton)findViewById(R.id.add);
            addButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onAdd();
                }
            });
    
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent it) {
            if(resultCode==RESULT_OK) {
                updateDataBaseAndListView(requestCode, it);
            }
        }
    
    
        //加载已经存在的note
        private void loadHistoryData() {
            Uri uri = Uri.parse("content://com.example.note.provider/note");
            Cursor cursor = getContentResolver().query(uri,null, null, null, null);
            if (cursor!=null) {
                while (cursor.moveToNext()) {
                    Log.d("MainActivity", "current num: " + cursor.getInt(cursor.getColumnIndex("num")));
                    Log.d("MainActivity", "id: " + cursor.getInt(cursor.getColumnIndex("id")));
                    Log.d("MainActivity", "getAlarm: " + cursor.getString(cursor.getColumnIndex("alarm")));
    
                    int tag = cursor.getInt(cursor.getColumnIndex("tag"));
                    String textDate = cursor.getString(cursor.getColumnIndex("textDate"));
                    String textTime = cursor.getString(cursor.getColumnIndex("textTime"));
                    boolean alarm = cursor.getString(cursor.getColumnIndex("alarm")).length() > 1 ? true : false;
                    String mainText = cursor.getString(cursor.getColumnIndex("mainText"));
                    OneNote temp = new OneNote(tag, textDate, textTime, alarm, mainText);
                    notelist.add(temp);
                }
                cursor.close();
            }
    
        }
    
    
        //传递intent到EditActivity
        private void transportInformationToEdit(Intent it, Note record) {
            it.putExtra("num",record.getNum());
            it.putExtra("tag",record.getTag());
            it.putExtra("textDate",record.getTextDate());
            it.putExtra("textTime",record.getTextTime());
            it.putExtra("alarm",record.getAlarm());
            it.putExtra("mainText",record.getMainText());
        }
    
        //按下添加按钮事件
        public void onAdd() {
            Intent it=new Intent(this,Edit.class);
            //note列表有多少记录,position可以作为新note的位置(因为notelist是数组,下标比长度减一)
            int position = notelist.size();
            Calendar c=Calendar.getInstance();
            String current_date=getCurrentDate(c);
            String current_time=getCurrentTime(c);
            it.putExtra("num",position);
            it.putExtra("tag",4);
            it.putExtra("textDate",current_date);
            it.putExtra("textTime",current_time);
            it.putExtra("alarm","");
            it.putExtra("mainText","");
            startActivityForResult(it,position);
        }
    
           //根据"alarm"设置闹钟
        private void loadAlarm(String alarm, int num, int days) {
            /**
             * 当闹钟响起时,我们想向broadcast 一个intent给BroadcastReceiver
             */
            Note record=getNoteWithNum(num);
            //安排闹钟服务
            Intent intent = new Intent(MainActivity.this, AlarmService.class);
            intent.putExtra("alarmId",record.getId());
            intent.putExtra("alarm",alarm);
            startService(intent);
        }
    
        //删除列表中note时,如果设置了闹钟就取消闹钟
        private void cancelAlarm(int num) {
            Intent intent = new Intent(MainActivity.this, AlarmService.class);
            stopService(intent);
        }
    
    }
    
    

    ⑤ 编写AlarmReceive.java,编写方法showNotice提醒闹钟广播

    private void showNotice(Context context) {
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
            int num=alarmId-BIG_NUM_FOR_ALARM;
            Log.d("MainActivity","alarmNoticeId "+num);
            Intent intent=new Intent(context,Edit.class);//转到EditActivity
            Note record= getNoteWithId(num);
            deleteTheAlarm(num);//or num
            transportInformationToEdit(intent,record);
            PendingIntent pi=PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
            NotificationManager manager=(NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
            NotificationChannel channel=new NotificationChannel("default","alarm",NotificationManager.IMPORTANCE_DEFAULT);
            manager.createNotificationChannel(channel);
            Notification notification=new NotificationCompat.Builder(context,"default")
                    .setContentTitle(record.getTextDate()+" "+record.getTextTime())
                    .setContentText(record.getMainText())
                    .setWhen(System.currentTimeMillis())
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.drawable.icon))
                    .setContentIntent(pi)
                    .setAutoCancel(true)
                    .setSound(Uri.fromFile(new File("/System/media/audio/ringtones/Luna.ogg")))
                    .setVibrate(new long[]{1000,500,1000})
                    .setLights(Color.GREEN,1000,1000)
                    .setDefaults(NotificationCompat.DEFAULT_ALL)
                    .setPriority(NotificationCompat.PRIORITY_MAX)
                    .build();
            manager.notify(num,notification);
        }else {
            int num=alarmId-BIG_NUM_FOR_ALARM;
            Log.d("MainActivity","alarmNoticeId "+num);
            Intent intent=new Intent(context,Edit.class);
            Note record= getNoteWithId(num);
            deleteTheAlarm(num);//or num
            transportInformationToEdit(intent,record);
            PendingIntent pi=PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
            NotificationManager manager=(NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
            Notification notification=new NotificationCompat.Builder(context,"default")
                    .setContentTitle(record.getTextDate()+" "+record.getTextTime())
                    .setContentText(record.getMainText())
                    .setWhen(System.currentTimeMillis())
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.drawable.icon))
                    .setContentIntent(pi)
                    .setAutoCancel(true)
                    .setSound(Uri.fromFile(new File("/System/media/audio/ringtones/Luna.ogg")))
                    .setVibrate(new long[]{1000,500,1000})
                    .setLights(Color.GREEN,1000,1000)
                    .setDefaults(NotificationCompat.DEFAULT_ALL)
                    .setPriority(NotificationCompat.PRIORITY_MAX)
                    .build();
            manager.notify(num,notification);
        }
    }
    
    

    ⑥ 编写AlarmSerice.java,编写方法onStartCommand安排闹钟广播。

    public int onStartCommand(Intent intent, int flags, int startId) {
          new Thread(new Runnable() {
              @Override
              public void run() {
                  Log.d("AlarmService","executed at"+new Date().toString());
              }
          });
          //安排闹钟广播
          alarmId=intent.getIntExtra("alarmId",0);
          alarm=intent.getStringExtra("alarm");
          int alarm_hour=0;
          int alarm_minute=0;
          int alarm_year=0;
          int alarm_month=0;
          int alarm_day=0;
          int i=0, k=0;
          while(i<alarm.length()&&alarm.charAt(i)!='-') i++;
          alarm_year=Integer.parseInt(alarm.substring(k,i));
          k=i+1;i++;
          while(i<alarm.length()&&alarm.charAt(i)!='-') i++;
          alarm_month=Integer.parseInt(alarm.substring(k,i));
          k=i+1;i++;
          while(i<alarm.length()&&alarm.charAt(i)!=' ') i++;
          alarm_day=Integer.parseInt(alarm.substring(k,i));
          k=i+1;i++;
          while(i<alarm.length()&&alarm.charAt(i)!=':') i++;
          alarm_hour=Integer.parseInt(alarm.substring(k,i));
          k=i+1;i++;
          alarm_minute=Integer.parseInt(alarm.substring(k));
    
          Calendar alarm_time = Calendar.getInstance();
          alarm_time.set(alarm_year,alarm_month-1,alarm_day,alarm_hour,alarm_minute);
    
          Intent it = new Intent(this, AlarmReceiver.class);
          it.putExtra("alarmId",alarmId+BIG_NUM_FOR_ALARM);
          PendingIntent sender = PendingIntent.getBroadcast(this, alarmId+BIG_NUM_FOR_ALARM, it, 0);
          AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
          am.set(AlarmManager.RTC_WAKEUP, alarm_time.getTimeInMillis(), sender);
          
    return super.onStartCommand(intent, flags, startId);
      }
    
    

    程序运行截图

    主页面:
    主界面
    编辑界面,编辑界面由时间戳以及定时闹钟按钮组成,点击编辑按钮即可选择提醒时间:
    编辑界面
    选择时间,点击闹钟图标:
    选择日期
    选择具体时间
    设置成功后:
    设置成功后提醒
    设置成功后主界面显示备忘录:
    设置成功
    成功提醒事项:
    成功提醒事项

    学习点

    编写NoteAdapter的过程中,逐步理解了适配器的原理,知道了Adapter在View和Data中起到了传递数据的作用,是数据和界面之间一个重要的纽带。在此过程中,逐步加深了对界面的布局,学会了如何用CardView进行卡片式布局设计。加深了通知在软件中的应用处理。
    作者:杨少奇
    原文地址:https://blog.csdn.net/Eldbro/article/details/106690233

    展开全文
  • java+Mysql开发备忘录系统

    热门讨论 2013-11-10 23:28:51
    备忘录软件的主要功能包括添加备忘录、修改备忘录、查询备忘录、删除备忘录等。此外,还能够打开Windows系统中记事本、计算器等小工具。
  • android开发备忘录

    万次阅读 多人点赞 2015-04-24 21:45:34
    程序描述:实现备忘录的设置和提醒,当运行软件时,在主界面可以设定备忘录内容,单击"设置闹钟"按钮设置提醒的时间。每设置一个备忘录,会在按钮下方记录所设定的备忘录,方便用户查看。当设定备忘录的时间到时,在...
  • 介绍在上一篇设计模式-备忘录模式(Memento)的详解中,使用文字和示例代码解释了备忘录模式。对于备忘录模式的理解是本文基础。如果还不了解备忘录模式还请参考上一篇 首先我们都知道Android移动设备因为内存大小...
  • 自己开发的一个工作便签软件。用于临时记录工作中需要处理的事项,也可看做日报填写软件,非常好用。可自定义皮肤、新建标签页、设置计划、设置字体、靠边隐藏、状态提醒、设置透明度、工作统计等。比小黄条、微软...
  • 实用标准文案 课程设计报告 本科 课程 嵌入式系统 学号 姓名 班级 教师 时间 2013年5月3 日至6月20 日 计算机科学与技术系 精彩文档 实用标准文案 设计名称 基于Android 的手机备忘录软件设计 设计内容目的与要求 一...
  • Windows备忘录

    2012-11-16 20:09:27
    所有的手机都有备忘录,所有Windows也应该拥有自己的备忘录
  • 开发一个安卓app-备忘录

    千次阅读 多人点赞 2019-08-27 17:22:57
    效果图 工程目录: AddActivity代码: package cn.fanting.notpadnew; import android.annotation.SuppressLint; import android.content.Context; import android.content...import android.support.v7.ap...
  • shuffle备忘录记事本源代码,一款专用于Android手机客户端的应用软件源码,这是一个国外的android源码,代码规范,参考价值高。 运行环境:Java/Eclipse
  • QT4编写的备忘录软件

    2010-12-02 06:57:23
    用QT4编写的备忘录软件,附源码。在windows平台下编译通过
  • Android开发之Eclipse制作简易备忘录[定义].pdf
  • 备忘录软件开源 更多开源替代品 开源项目管理工具 Trello的替代品 Linux视频编辑器 Photoshop的开源替代品 开源替代品列表 有关开源替代品的最新文章 如果主流软件工具是专有的,这可能会令人沮丧...
  • 备忘录 退出 左键单击 左键双击 源码小管家——linDDv1.0发布版本:1.0日期:2017.09Copyright 2017 @Dingqiang Lin版本记录 日期 版本 作者 版本说明 2017.09 v1.0 林鼎强 备忘录提醒 对象用户希望自己定制...
  • 传统的嵌入式系统中,设计周期、硬件和软件开发是分开进行的,并在硬件完成后才将系统集成...软件同硬件设备调试通讯备忘录,能更好的实行实时通讯。下面具体介绍如何设置通信备忘录以及实现该功能所需做的准备工作。
  • 常州信息职业技术学院 软件开发与项目管理 学生作品 作品题目 基于Android的备忘录 作品作者 马高宏 指导教师 杨小溪 完成时间 2014.06.20 一项目简介 1.1选题背景 生活与工作中我们需要处理各种各样的事情也经常会...
  • 备忘录模式学习总结

    2019-05-01 15:37:05
    目录 备忘录模式 引言 定义 模式结构图 ...备忘录的封装性 ...备忘录模式 ...现在大多数软件都有撤销功能,快捷键一般都是Ctrl+Z。...备忘录模式是软件系统的“月光宝盒”,它提供了一种对象状态的撤销实现机制。 定...
  • 该小程序背景:类似与手机上的备忘录软件,目前由于时间或者技术的原因暂时只是实现了备忘录的基本功能。后续功能界面待开发持续更新该文章。 实现小程序的技术背景:使用微信开发者工具,前端界面的实现使用了微信小...
  • Blender sudo pacman -S blender或者直接从官网下载 Godot Engine直接从官网下载 Dia 图标编辑器sudo pacman -S dia VS Code sudo pacman -S visual-studio-code-bin FireFox 系统自带 Krita sudo pacman -S krita ...
  • 基于Android备忘录软件的设计与实现.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,506
精华内容 7,802
关键字:

软件开发备忘录