当前位置: 首页 > 知识库问答 >
问题:

如何安全地将数据从服务发送到正在运行的活动

孟鹤龄
2023-03-14

假设我在服务中有一个可用的字符串test=“value”,并希望将其发送到我正在运行的mainactivity。如何安全地发送数据?我在寻找一个最简单的例子,其他应用程序看不到数据。当我看意图时,它会说:

广播是任何应用程序都可以接收的消息。系统为系统事件提供各种广播,例如当系统启动或设备开始充电时。您可以将广播发送到

但是,我只想将其发送到我的应用程序,因为它包含私人数据。在我的服务中,我尝试了:

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra(getString(R.string.notification_intent), "6");
startActivity(intent);

其中主要活动。类是应该接收意图的类,但通过这种方式,我得到:

Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

如何安全地将数据从服务发送到活动?

共有1个答案

尉迟跃
2023-03-14

Q: 如何将数据从Android服务发送到我的活动?

A: 您有几种选择:

1、使用意图:

如何从服务到活动获取数据

从服务发送msg:

private static void sendMessageToActivity(Location l, String msg) {
    Intent intent = new Intent("GPSLocationUpdates");
    // You can also include some extra data.
    intent.putExtra("Status", msg);
    Bundle b = new Bundle();
    b.putParcelable("Location", l);
    intent.putExtra("Location", b);
    LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

注册以在活动中接收消息:

LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
            mMessageReceiver, new IntentFilter("GPSLocationUpdates"));

活动中的自定义消息接收器:

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Get extra data included in the Intent
        String message = intent.getStringExtra("Status");
        Bundle b = intent.getBundleExtra("Location");
        lastKnownLoc = (Location) b.getParcelable("Location");
        ...

我不会把这描述为“不安全”——这可能是一个完全合理的方法。

2、将活动绑定到服务

https://developer.android.com/guide/components/bound-services

服务:

public class LocalService extends Service {
    // Binder given to clients
    private final IBinder binder = new LocalBinder();
    ...
public class LocalBinder extends Binder {
        LocalService getService() {
            // Return this instance of LocalService so clients can call public methods
            return LocalService.this;
        }
    }


    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

活动:

@Override
    protected void onStart() {
        super.onStart();
        // Bind to LocalService
        Intent intent = new Intent(this, LocalService.class);
        bindService(intent, connection, Context.BIND_AUTO_CREATE);
        ...
     @Override
        protected void onStop() {
            super.onStop();
            unbindService(connection);
            mBound = false;
        ...
    /** Defines callbacks for service binding, passed to bindService() */
        private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className,
                IBinder service) {
            // We've bound to LocalService, cast the IBinder and get LocalService instance
            LocalBinder binder = (LocalBinder) service;
            mService = binder.getService();
            mBound = true;
        }
    ...
    // To use the service, your client would call mService.someMethod()...            

我不确定您到底在寻找什么,但示例1可能是您最好的选择。

以下教程可能会帮助您了解更多细节/想法:

Android中的服务基础:

  • 第1部分:基础
  • 第2部分:将服务绑定到活动
  • 第3部分:使用Messenger

https://developer.android.com/guide/components/broadcasts

Android为应用程序提供三种发送广播的方式:

  • sendOrderedBroadcast(Intent,String)方法一次向一个接收器发送广播
  • sendBroadcast(Intent)方法以未定义的顺序向所有接收机发送广播。这称为正常广播。这更有效,但意味着接收器无法读取其他接收器的结果、传播从广播接收到的数据或中止广播
  • LocalBroadcastManager。sendBroadcast方法将广播发送到与发送方位于同一应用程序中的接收方。如果您不需要跨应用发送广播,请使用本地广播。该实现更加高效(无需进程间通信),并且您无需担心与其他应用程序能够接收或发送您的广播相关的任何安全问题

此外:

https://developer.android.com/guide/components/broadcasts#restrict-broadcasts-permissions

限制具有权限的广播

权限允许您将广播限制为持有某些权限的应用程序集。您可以对广播的发送者或接收者实施限制。

使用权限发送

调用sendBroadcast(Intent,String)或sendOrderedBroadcast(Intent,String,BroadcastReceiver,Handler,int,String,Bundle)时,可以指定权限html" target="_blank">参数。只有在其清单中使用标签请求许可的接收者(如果有危险,随后被授予许可)才能接收广播。例如,以下代码发送广播:

就个人而言,我认为仅仅使用意图根本没有任何“安全”问题。

但是,如果您想要或需要,您可以使用上述技术进一步锁定通信。

希望这有帮助!

 类似资料:
  • 在我的应用程序中,我试图将数据从我的发送到一个名为的服务。这是我的以下代码: MainActivity.class: BGS服务。课程: 但我没有在服务类中获取数据。以下是我得到的错误: 02-25 09:05:41.166:E/AndroidRuntime(2633): JAVAlang.RuntimeException:无法启动活动 组件信息{com.microapple.googleplac

  • 问题内容: 我在通过Notification从服务向活动发送数据时遇到问题,我单击了一个活动被调用的通知,但是当我尝试通过捆绑包添加一些参数时,我无法获得所谓的intent中的参数,我经历了链接 如何将通知单击中的参数发送到活动? 但是仍然没有运气。 其他人也发生过同样的问题吗? 提前致谢。 问题答案: 您还必须修改清单文件。 这是有效的示例: 这些变量和方法是Service类的成员: 这是Mai

  • 问题内容: 我有一个在我的应用程序中的单独线程中运行的类。我可以一次运行多个线程,并且这些线程是守护程序。一段时间后, 其中一些 线程需要接收和处理消息。我该怎么做呢? 我的代码示例如下所示: 输出: 但是,我希望最后五行与无关,而不是,我希望对我来说像这样: 我如何正确地向正在运行的线程发送这样的消息? 附录: 如果我在该块之后有这个块,并使用@dano的代码来解决上述问题,则它似乎没有响应这些

  • 问题内容: 我想使用Android将数据发送到我的php页面。我该怎么做? 问题答案: 您可以使用AndroidHttpClient进行GET或POST请求: 创建一个AndroidHttpClient来执行您的请求。 创建一个HttpGet或HttpPost请求。 使用setEntity和setHeader]方法填充请求。 对您的请求使用客户端上的execute方法之一。

  • 我一直在做这个项目,其中一个部分包括从Raspberry向我的服务器发送一些数据。但它不能正常工作,我不知道为什么。我试图通过删除“urllib2”并使用“request”来修复错误。但徒劳的是,一切都没有改变。如果有人能帮助我,我会非常感激的。谢谢! PHP代码: python代码:

  • 我想在片段的活动中使用一些文本视图(cityField,updatedField)。我知道在活动中使用它们会更容易,但问题是,由于要获取一些JSON数据,我不得不在Fragment上加入一些代码 我已经得到了活动代码的ID 现在我想在我的片段中使用它们 所以问题是 - 这可能吗?如果可能,如何? 我已经检查了这个网站上的一些答案 - 在Android中将数据从活动发送到片段 如何使用捆绑包将数据从