我需要一个简单的服务(在后台运行),当用户从浏览器或短信等复制任何内容时,会显示一个toast提示该文本。
例如:
此服务必须在Android 2.1及更高版本上运行。
今天(从上午10:35到现在[晚上11:11]),我一直在搜索互联网并测试几个代码,但迄今为止还没有得出结论。
对于这样的问题,一些用户建议使用(my-clips)项目。我找到了该项目,但这个项目很复杂,让我感到困惑。
可以有人给我展示一个非常简单的例子吗? 谢谢
编辑:
我需要一个简单的服务(在后台运行),当用户从浏览器或短信等复制任何内容时,会显示一个toast提示该文本。
例如:
此服务必须在Android 2.1及更高版本上运行。
今天(从上午10:35到现在[晚上11:11]),我一直在搜索互联网并测试几个代码,但迄今为止还没有得出结论。
对于这样的问题,一些用户建议使用(my-clips)项目。我找到了该项目,但这个项目很复杂,让我感到困惑。
可以有人给我展示一个非常简单的例子吗? 谢谢
编辑:
toast
:您复制了这个:...
我所做的方法是:
final ClipboardManager clipboard = (ClipboardManager) this.getSystemService(CLIPBOARD_SERVICE);
clipboard.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
public void onPrimaryClipChanged() {
String a = clipboard.getText().toString();
Toast.makeText(getBaseContext(), "Copy:\n" + a, Toast.LENGTH_LONG).show();
}
});
不使用服务、不添加到清单或任何其他方式,只需先打开您的应用程序,然后将其关闭,并从任何地方复制文本即可在应用程序中显示
<service
android:name=".service.ClipboardMonitorService"
android:label="Clipboard Monitor"
android:exported="false"/>
这是对我有效的方法。
首先,广播:
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
ComponentName service = context.startService(
new Intent(context, ClipboardMonitor.class));
if (service == null) {
Log.e("TAG", "Can't start service");
}
} else {
Log.e("TAG", "Recieved unexpected intent " + intent.toString());
}
}
然后这就是服务
private MonitorTask mTask = new MonitorTask();
private ClipboardManager mCM;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
mCM = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
mTask.start();
}
@Override
public void onDestroy() {
mTask.cancel();
}
@Override
public void onStart(Intent intent, int startId) {
}
/**
* Monitor task: monitor new text clips in global system clipboard and
* new image clips in browser download directory
*/
private class MonitorTask extends Thread {
private volatile boolean mKeepRunning = false;
private String mOldClip = null;
public MonitorTask() {
super("ClipboardMonitor");
}
/** Cancel task */
public void cancel() {
mKeepRunning = false;
interrupt();
}
@Override
public void run() {
mKeepRunning = true;
while (true) {
doTask();
if (!mKeepRunning) {
break;
}
}
}
private void doTask() {
if (mCM.hasText()) {
String newClip = mCM.getText().toString();
if (!newClip.equals(mOldClip)) {
mOldClip = newClip;
// Toast.makeText(getApplicationContext(), "" + newClip.toString(), Toast.LENGTH_SHORT).show();
Log.i("TAG", "new text clip inserted: " + newClip.toString());
}
}
}
另外,权限:
<uses-permission android:name="android.permission.GET_CLIPS" />
<uses-permission android:name="android.permission.READ_CLIPS" />
<uses-permission android:name="android.permission.WRITE_CLIPS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<service android:name=".ClipboardMonitor" />
<receiver android:name=".ClipboardMonitorStarter">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
addPrimaryClipChangedListener()
@carlos-carrizales - Sp4Rxclipboard.removePrimaryClipChangedListener(listener)
, 参见 https://developer.android.com/reference/android/content/ClipboardManager.html#removePrimaryClipChangedListener(android.content.ClipboardManager.OnPrimaryClipChangedListener) - lucidbrot