隐私优先的轻量级备忘录 Memos 打造专属秘密空间

本文首发于只抄博客,欢迎点击原文链接了解更多内容。

前言

Memos 是一个非常轻量的备忘录软件,与传统笔记软件不同,它更像是私有化的微博、朋友圈,所有的笔记按照时间线排列在主页。它既可以作为跨平台的笔记软件,也可以作为专属于自己的树洞。Memos 有以下这些特点:

  • 支持 Markdown,可以很方便的插入标签、图片、代码块、To-Do 等
  • 支持连接 Telegram Bot,通过给 Bot 发消息的形式记录笔记
  • 支持通过 CSS 与 JavaScript 自定义样式
  • 数据存储支持 SQLite 与 S3 对象存储
  • 完全开源、永久免费

安装

通过以下 Docker 命令直接启动

docker run -d --name memos -p 5230:5230 -v ~/.memos/:/var/opt/memos neosmemo/memos:stable

也可以使用 Docker Compose 启动

version: "3.0"
services:
  memos:
    image: neosmemo/memos:stable
    container_name: memos
    volumes:
      - ~/.memos/:/var/opt/memos
    ports:
      - 5230:5230

基本使用

  1. 通过 http://ip:5230 进入 Memos,首次进入需要设置用户名与密码

memos1

  1. 登录完成后,来到设置->偏好设置中,将语言改为简体中文

memos2

  1. 返回主页,在上方的输入框中输入内容,提交即可完成记录
    • 标签: #标签
    • To-Do: - []

memos3

连接 Telegram Bot

有时候在移动端打开网页记录并不是很方便,可以通过 Telegram 的 Bot 功能快速记录内容

  1. 进入设置->系统,将机器人的 Token 填入并保存

memos4

  1. 然后进入设置->偏好设置中,将自己账号的 UserID 填入并保存(向机器人发送任意消息获取)

memos5

  1. 直接向机器人发送需要记录的内容

memos6

  1. 返回 Memos,可以看到该内容已经原封不动的存入 Memos 中

memos7

注意事项

  • Memos 默认开启了用户注册,如果单人使用,建议到设置->系统中,取消勾选允许用户注册
  • Memos 默认可见性为私有,建议保持默认,需要公开的内容可以在发布时,单独设置可见性
  • Memos 存储默认使用 SQLite,备份数据时直接备份数据库文件即可
  • Memos 支持常见的 Markdown 语法,具体可以参考官方文档 - Content Syntax
好的,下面我来为您讲解如何在Android Studio中实现备忘录应用的开发。 首先,我们需要创建一个新的Android Studio项目。在创建项目时,您可以选择空白活动或使用模板(例如带有导航抽屉的活动)。在这里,我们将使用空白活动来创建我们的备忘录应用。 接下来,我们需要设计应用的用户界面。我们将使用RecyclerView来显示备忘录列表,并且使用一个FloatingActionButton来添加新的备忘录。使用Android Studio的布局编辑器,您可以轻松地设计出这个用户界面。 在我们开始编写代码之前,我们需要添加RecyclerView和FloatingActionButton的依赖库。在app/build.gradle文件中,添加以下依赖项: ``` dependencies { implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.android.support:design:28.0.0' } ``` 接下来,我们需要创建一个备忘录数据模型类Memo,该类将具有备忘录的标题和内容属性。例如: ``` public class Memo { private String title; private String content; public Memo(String title, String content) { this.title = title; this.content = content; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } ``` 接下来,我们需要创建一个备忘录列表适配器MemoAdapter,该适配器将显示备忘录列表。例如: ``` public class MemoAdapter extends RecyclerView.Adapter<MemoAdapter.ViewHolder> { private List<Memo> memos; public MemoAdapter(List<Memo> memos) { this.memos = memos; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_memo, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Memo memo = memos.get(position); holder.titleTextView.setText(memo.getTitle()); holder.contentTextView.setText(memo.getContent()); } @Override public int getItemCount() { return memos.size(); } public class ViewHolder extends RecyclerView.ViewHolder { private TextView titleTextView; private TextView contentTextView; public ViewHolder(View itemView) { super(itemView); titleTextView = itemView.findViewById(R.id.titleTextView); contentTextView = itemView.findViewById(R.id.contentTextView); } } } ``` 接下来,我们需要创建一个活动MainActivity,该活动将显示备忘录列表。在MainActivity中,我们需要将RecyclerView与MemoAdapter进行绑定,并在FloatingActionButton的单击事件中添加新的备忘录。例如: ``` public class MainActivity extends AppCompatActivity { private List<Memo> memos = new ArrayList<>(); private MemoAdapter memoAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = findViewById(R.id.recyclerView); memoAdapter = new MemoAdapter(memos); recyclerView.setAdapter(memoAdapter); recyclerView.setLayoutManager(new LinearLayoutManager(this)); FloatingActionButton fab = findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showAddMemoDialog(); } }); } private void showAddMemoDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); View view = LayoutInflater.from(this).inflate(R.layout.dialog_add_memo, null); final EditText titleEditText = view.findViewById(R.id.titleEditText); final EditText contentEditText = view.findViewById(R.id.contentEditText); builder.setView(view) .setTitle("Add Memo") .setPositiveButton("Add", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String title = titleEditText.getText().toString(); String content = contentEditText.getText().toString(); Memo memo = new Memo(title, content); memos.add(memo); memoAdapter.notifyDataSetChanged(); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); AlertDialog dialog = builder.create(); dialog.show(); } } ``` 最后,在这个应用程序中,我们需要添加一些布局文件。例如: activity_main.xml ``` <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="4dp" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="16dp" android:src="@drawable/ic_add" /> </android.support.design.widget.CoordinatorLayout> ``` item_memo.xml ``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="8dp"> <TextView android:id="@+id/titleTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="24sp" android:textStyle="bold" /> <TextView android:id="@+id/contentTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" /> </LinearLayout> ``` dialog_add_memo.xml ``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="8dp"> <EditText android:id="@+id/titleEditText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Title" /> <EditText android:id="@+id/contentEditText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Content" /> </LinearLayout> ``` 现在您已经完成了备忘录应用的开发。您可以在模拟器或实际设备上运行该应用程序,并开始添加和查看备忘录了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值