Java 在不打开应用程序的情况下,使用通知操作更改TextView的文本

Java 在不打开应用程序的情况下,使用通知操作更改TextView的文本,java,android,notifications,Java,Android,Notifications,我有一个名为TextView的Activity和TextView。在活动中有一个函数void changeText(),用于更改textView的文本。按下活动中的按钮可调用此功能。调用此函数的另一种方法是使用通知操作(NotificationCompat.Builder.addAction)。调用通知中的操作时,我不希望活动显示在屏幕上。我更希望活动以静默方式(在后台)调用void changeText()。当用户下次进入我的应用程序时(它仍然处于活动状态),他应该会看到更改的文本。如何实现这

我有一个名为
TextView
Activity
TextView
。在活动中有一个函数
void changeText()
,用于更改
textView
的文本。按下活动中的
按钮
可调用此功能。调用此函数的另一种方法是使用通知操作(
NotificationCompat.Builder.addAction
)。调用通知中的操作时,我不希望活动显示在屏幕上。我更希望活动以静默方式(在后台)调用
void changeText()
。当用户下次进入我的应用程序时(它仍然处于活动状态),他应该会看到更改的文本。如何实现这一点?

试着研究一下。您可以将要显示的文本保存在键值对中,然后将其加载并显示在
onCreate()
onResume()
方法中的
TextView
中。

注意:此解决方案仅在应用程序在后台运行时有效,如果要在应用程序不在后台运行时执行此操作,可以使用

有几种方法可以做到这一点,最简单和最好的方法是在活动中简单地存储一个静态字符串,当您创建/恢复该活动时,您会更新文本:

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import java.lang.Override;

public class TextActivity extends Activity
{
    private static String mText;
    public static void setText(String text) { mText = text; }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        TextView textView = (TextView)findViewById(R.id.textView);

        if (mText != null)
            textView.setText(mText);
    }
}
现在,当您收到通知时,您将更新如下文本:

TextActivity.setText("Blah blah");

若你们不想在点击按钮时活动显示在屏幕上,你们应该使用pendingent.getBroadcast()或pendingent.getService()并保存在SharedReferences中,如@Ido所说

您可以在名为YourReceiver.java的新文件中创建广播接收器

public class YourReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        //save your value on shared preferences here
        Log.e("test", "receive broadcast");
    }

}
在AndroidManifest.xml中,必须声明接收方

<receiver android:name="yourpackage.YourReceiver">
    <intent-filter>
        <action android:name="yourpackage.receiver"/>
    </intent-filter>
</receiver>
我希望这能帮助你

更多信息:


您能告诉我如何创建
pendingent
以通知它不会将我的应用程序带到屏幕上吗?那是我的问题。剩下的部分工作得很好。我不太理解你的问题,你不希望应用程序以
PendingContent
打开吗?是的,这就是重点。用户应该能够使用通知调用该函数,而无需离开他正在使用的应用程序。谢谢。看起来很有希望。有没有办法使
BroadcastReceiver
类成为非静态的,以便从
onReceive
方法中调用我周围活动的方法?要使类成为非静态的,您必须在另一个文件中声明并从manifest.xml更新安卓:name receiver我认为问题仍然是如何调用我的来自onReceive方法的活动。我试图从
public void onReceive(context-context,Intent-Intent)
中给出的上下文中强制转换活动,但没有成功。实际上,提交的上下文是android.app.ReceiverRestrictedContext的一个实例,而不是我的活动的一个实例,尽管我使用第一个参数调用了
pendingent.getBroadcast
。好吧,它不起作用,你需要对接收上下文的活动执行静态方法,举个例子,若您要保存首选项上的值,只需调用将其保存为参数的方法,并将上下文作为参数传递,它应该可以工作
Intent intent = new Intent();
intent.setAction("yourpackage.receiver")

PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT)