Android 永久侦听剪贴板更改

Android 永久侦听剪贴板更改,android,android-service,clipboard,clipboardmanager,Android,Android Service,Clipboard,Clipboardmanager,我正在构建一个应用程序,它将启动一个能够侦听剪贴板更改的服务 我真正想要的是在剪贴板上永久记录(并将其写入存储器)每一次更改,这样当我启动应用程序时,我就可以读取该服务写入的存储文件。这意味着,我的应用程序和服务之间不需要直接通信,也不需要使用wakelocks来保持设备正常运行(因为设备处于睡眠状态时,剪贴板几乎不会改变) 我正在使用处理程序反复检查剪贴板,我想知道如何实现clipboardListener来检查这些更改。找到了 我已经这样做了,它的工作非常完美,内存中的进程只消耗3mb。 我

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

我真正想要的是在剪贴板上永久记录(并将其写入存储器)每一次更改,这样当我启动应用程序时,我就可以读取该服务写入的存储文件。这意味着,我的应用程序和服务之间不需要直接通信,也不需要使用wakelocks来保持设备正常运行(因为设备处于睡眠状态时,剪贴板几乎不会改变)

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

找到了

我已经这样做了,它的工作非常完美,内存中的进程只消耗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();
                }  
            }
        }
    }
}

+这是我的荣幸。然而,我不知道在奥利奥该怎么做。我使用过JobIntentService,但android停止了该服务,因此它不再是永久性的。我们必须使用向后兼容的
workManager
,但我需要一个解决方案来做同样的事情,这在android 10+中仍然有效吗?