从非 ui 线程设置剪贴板

Posted

技术标签:

【中文标题】从非 ui 线程设置剪贴板【英文标题】:Setting Clipboard from non-ui thread 【发布时间】:2016-09-26 16:56:37 【问题描述】:

问题:无法从非 ui 后台线程设置剪贴板


我的应用在后台时如何设置剪贴板?

public class Messages 

    public void SetMessage(String text) 
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) 
            ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
            clipboard.setText(text);
         else 
            android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
            ClipData clip = ClipData.newPlainText("NewClip", text);
                            clipboard.setPrimaryClip(clip);
        
    

错误:无法解析 getSystemService(java.lang.String)


我尝试了多种方法来解决这个问题,其中之一是:


配置类

/* I made a Config class file like so: */
public final class Config 
    public static com.dysanix.official.MainActivity MainContext = null;



/* And put this in the onCreate of the MainActivity: */
Config.MainContext = this;


/*
 * And then using Config.MainContext.getSystemService() in the other
 * class works, as long as the UI is visible on the screen.. but as soon as
 * I tab out, the code doesn't work anymore.
 */

我还尝试在 MainActivity 中创建一个“Runnable”并从另一个类调用它,但同样的问题:它可以工作,直到我退出应用程序。我从循环的 AsyncTask 中调用该方法,我知道该方法有效,因为控制台在循环结束时不断打印日志消息。

任何帮助将不胜感激!

【问题讨论】:

当你的活动停止时不要让任务继续运行,当某些事情需要运行比活动更长的时间时使用服务,并将后台任务的生命周期与服务的生命周期联系起来。这就是他们的目的。 【参考方案1】:

错误:无法解析 getSystemService(java.lang.String)

getSystemService()Context 上的一个方法。将Context 传递给您的SetMessage() 方法,或将该方法移至某个ActivityService 或其他Context 实现。然后,在那个Context 上拨打getSystemService()

我尝试了多种方法来解决此问题,其中之一是:

不要将Activity 放在静态字段中。这不仅会代表内存泄漏,而且Activity 一旦被销毁就毫无用处。

问题:无法从非 ui 后台线程设置剪贴板

这里没有与线程相关的内容。

【讨论】:

好的,所以我创建了一个正在运行的服务,为了证明这一点,我用“正在运行”向它添加了一个 TextView。它与其他聊天重叠。 (我使用了这个站点:myandroidtuts.blogspot.nl/2013/05/…)现在我将如何将此剪贴板方法添加到该服务并从随机的非 UI 类中调用它? @DysanixOfficial:很可能,您不会从“随机类”中调用它。无论那个“随机类”是什么都需要访问Context 好的,我有服务,我有一个“Messages.class”文件。该消息类文件如下所示:public class Messages public static void SetMessage(Context context, String text) MainService.SetMessage(context, text); 现在,如果我想从任何我想要的类调用 Messages.SentMessage(),上下文会是什么? @DysanixOfficial:你不会打电话给SentMessage()“来自任何[你]想要的班级”。您可以从Context 调用它(例如,您的活动或服务,因此您可以将this 作为Context 传递),或者从某个本身具有Context 的对象调用它。 哦哦!我现在明白了!我很抱歉,现在我回想起来我看起来真的很愚蠢,但我的思维方式很奇怪。谢谢你的回答!我现在真的明白了!

以上是关于从非 ui 线程设置剪贴板的主要内容,如果未能解决你的问题,请参考以下文章

剪贴板增强---Kawvin增强剪贴板_V2.0

在 ASP.NET 中将线程设置为 STA

AS3 如何将数据从对象提取到剪贴板、rest、db、文件等?

从剪贴板获取数据并重新设置 - WINAPI,C [重复]

从 flashVars 将文本设置到剪贴板

从非 UI 线程调用 Snackbar.make() 是如何工作的?