永久收听剪贴板的变化

我正在构build一个应用程序,该应用程序将启动一个能够侦听剪贴板更改的服务。

我真正想要的是logging(并写入存储)剪贴板中的每一个变化永久,所以当我启动我的应用程序,我可以读取由该服务写入的存储的文件。 这意味着,我的应用程序和服务之间不需要直接通信,也不需要使用唤醒锁来保持设备(因为在设备睡着时剪贴板几乎不会改变)。

我正在使用处理程序来重复检查剪贴板,我想知道如何实现clipboardListener来检查这些更改。

Solutions Collecting From Web of "永久收听剪贴板的变化"

find了!

我已经做到了这一点,它完美地运行,内存中的进程只消耗3mb。 我发布这个以防有人可能需要类似的东西。

如果有任何错误,请指出:D

import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Calendar; import android.app.Service; import android.content.ClipData; import android.content.ClipDescription; import android.content.ClipboardManager; import android.content.ClipboardManager.OnPrimaryClipChangedListener; import android.content.Intent; import android.os.IBinder; public class CBWatcherService extends Service { private final String tag = "[[ClipboardWatcherService]] "; private OnPrimaryClipChangedListener listener = new OnPrimaryClipChangedListener() { public void onPrimaryClipChanged() { performClipboardCheck(); } }; @Override public void onCreate() { ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).addPrimaryClipChangedListener(listener); } @Override public int onStartCommand(Intent intent, int flags, int startId) { File folder = new File(ClipboardCacheFolderPath); // ClipboardCacheFolderPath is a predefined constant with the path // where the clipboard contents will be written if (!folder.exists()) { folder.mkdir(); } return START_STICKY; } @Override public IBinder onBind(Intent intent) { return null; } private void performClipboardCheck() { ClipboardManager cb = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); if (cb.hasPrimaryClip()) { ClipData cd = cb.getPrimaryClip(); if (cd.getDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) { try { File folder = new File(ClipboardCacheFolderPath); if (!folder.exists()) { folder.mkdir(); } Calendar cal = Calendar.getInstance(); String newCachedClip = cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" + cal.get(Calendar.DAY_OF_MONTH) + "-" + cal.get(Calendar.HOUR_OF_DAY) + "-" + cal.get(Calendar.MINUTE) + "-" + cal.get(Calendar.SECOND); // The name of the file acts as the timestamp (ingenious, uh?) File file = new File(ClipboardCacheFolderPath + newCachedClip); file.createNewFile(); BufferedWriter bWriter = new BufferedWriter(new FileWriter(file)); bWriter.write((cd.getItemAt(0).getText()).toString()); bWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } } }