`

Service 启动Activity

阅读更多
我想我们一般在Service里想启动Activity一定会这样写:
 Intent intentv = new Intent(Intent.ACTION_VIEW);
             intentv.setData(uri);
             intentv.putExtra("keepTitle", true);
             startActivity(intentv);

这样写就会报错的:

03-11 02:37:09.737: ERROR/AndroidRuntime(7881): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

提示要加上FLAG_ACTIVITY_NEW_TASK,所以加上 intentv.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);这一行就可以了。

但若看的源码够的话,还会发现有另外一种方法在Service里面启动Activity的另外一种方法:通过PendingIntent,下面就以Tag中TagView(Activity)和TagService为例子:

TagView里启动TagService并且把待会在TagService里面启动的Activity用Pending将其封装好并且传给TagService:
TagService.saveMessages(this, msgs, false, getPendingIntent());private PendingIntent getPendingIntent() {
        Intent callback = new Intent();
        callback.setClass(this, TagViewer.class);
        callback.setAction(Intent.ACTION_VIEW);
        callback.setFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP);
        callback.putExtra(EXTRA_KEEP_TITLE, true);

        return PendingIntent.getActivity(this, 0, callback, PendingIntent.FLAG_CANCEL_CURRENT);
    }


public static void saveMessages(Context context, NdefMessage[] msgs, boolean starred,
            PendingIntent pending) {
        Intent intent = new Intent(context, TagService.class);
        intent.putExtra(TagService.EXTRA_SAVE_MSGS, msgs);
        intent.putExtra(TagService.EXTRA_STARRED, starred);
        intent.putExtra(TagService.EXTRA_PENDING_INTENT, pending);
        context.startService(intent);
    }

@Override
    public void onHandleIntent(Intent intent) {
        if (intent.hasExtra(EXTRA_SAVE_MSGS)) {
            Parcelable[] msgs = intent.getParcelableArrayExtra(EXTRA_SAVE_MSGS);
            NdefMessage msg = (NdefMessage) msgs[0];

            ContentValues values = NdefMessages.toValues(this, msg, false, System.currentTimeMillis());
            Uri uri = getContentResolver().insert(NdefMessages.CONTENT_URI, values);
            if (intent.hasExtra(EXTRA_PENDING_INTENT)) {
                Intent result = new Intent();
                result.setData(uri);

                PendingIntent pending = (PendingIntent) intent.getParcelableExtra(EXTRA_PENDING_INTENT);
             
                try {
                    pending.send(this, 0, result);
                } catch (CanceledException e) {
                    if (DEBUG) Log.d(TAG, "Pending intent was canceled.");
                }
            }

            return;
        }
.....
}


通过pending.send(this, 0, result);启动了对应的Activity.

这里也是PendingIntent的用法之一。
我不太明白这两种启动Activity的方法有什么不同之处虽然效果都是一样的,对开销会怎样,希望知道的朋友能和我分享。呵呵..




分享到:
评论

相关推荐

    service中启动activity

    通常,Service启动Activity是通过发送意图(Intent)来实现的。 **一、Service启动Activity的基本流程** 1. **创建Intent**: 首先,你需要在Service中创建一个Intent对象,指定要启动的Activity类名。例如: ```...

    通过aidl service调用activity

    4. 从Service启动Activity: 通常,我们不建议直接在Service中启动Activity,因为这可能引发用户界面问题。然而,如果确实需要,可以通过发送意图(Intent)来启动Activity。在Service中: ```java Intent intent...

    Activity与Service之间通信

    Service的启动,Activity与Service之间数据传递,Binder利用bindService实现Service传递数据给Activity,Activity的成员Broadcast实现Service传递数据给Activity

    Service向Activity传值(kotlin)

    当我们启动或绑定Service时,可以使用Intent对象将数据传递给Service。同样,Service也可以通过Intent返回结果到Activity。首先,在Service中创建一个BroadcastReceiver,用于接收发送的数据,并在适当的时候(例如...

    Android-Service与Activity传值

    在`Activity`中启动`Service`,通常使用`startService()`方法,需要传入一个`Intent`对象,`Intent`中可以携带数据。例如: ```java Intent intent = new Intent(this, MyService.class); // 如果需要传递数据,...

    Android Service与Activity交互

    本示例"Android Service与Activity交互"旨在演示如何在Service启动后,通过线程进行异步操作,并在完成特定任务后,通过发送广播(Broadcast)通知Activity来更新用户界面。 首先,我们需要创建一个Service,通常在...

    Activity和Service

    在Android开发中,Activity和Service是两个非常重要的组件,它们各自承担着不同的职责,但都是应用程序运行不...开发者需要熟练掌握如何启动、管理Activity以及如何启动和绑定Service,以实现应用程序的各种功能需求。

    Service与Activity的通信

    - 使用`startService()`或`bindService()`启动`Service`,根据需求选择。如果需要`Activity`与`Service`持续交互,推荐使用`bindService()`。 - 实现`ServiceConnection`接口,重写`onServiceConnected()`和`...

    service与activity之间的通信

    startService()用于启动并执行一次性任务,而bindService()则用于建立Activity与Service的连接,实现双向通信。 二、Service与Activity通信方式 1. startService(): 当Activity启动Service时,可以通过Intent传递...

    安卓开发观察者模式应用-一个service通知多个activity更新ui的实现

    在给定的场景中,我们将讨论如何利用观察者模式来实现一个Service通知多个Activity更新UI的功能。 首先,我们需要理解Service和Activity之间的交互方式。在Android中,Service是后台运行的组件,而Activity是用户...

    android开机启动Activity/Service/App的三合一demo

    android开机启动Activity/Service/App的三合一demo,本人写了一个小小demo,把如果开机自启动Activity、Service、APP写了下,欢迎下载。

    最简洁的service和activity绑定

    startService()启动Service并执行onStartCommand()方法,服务会持续运行直到stopService()或stopSelf()被调用。bindService()则用于建立Activity和服务之间的连接,当所有客户端(Activity)解绑后,Service会被销毁...

    Activity绑定Service(Kotlin)

    本教程将重点讲解如何在Kotlin环境中实现Activity与Service的绑定、启动、解绑以及关闭过程。 1. **Service的基础概念** Service是Android系统中的一个关键组件,它在后台运行,不提供用户界面。Service可以用来...

    初识 Service(三) 演示:Service给 Activity传递消息

    在创建Service时,我们通常会重写`onStartCommand()`或`onBind()`方法来处理服务启动或绑定时的逻辑。 当Service需要向Activity发送消息时,有多种方法可以实现: 1. **使用Intent**: 可以通过发送Broadcast ...

    android Service 与Activity绑定

    在Android应用开发中,Service和Activity是两个非常重要的组件,它们各自承担着不同的职责。Service主要负责在后台长时间运行的任务,而Activity则专注于用户界面的交互。本篇将深入探讨Service与Activity之间的绑定...

    android多个activity和一个service通信

    在Android应用开发中,Activity和Service是两个关键组件。Activity代表用户界面,而Service则用于在后台执行长时间运行的任务,不直接与用户交互。在实际项目中,常常需要多个Activity与一个Service进行通信,比如本...

    Service与多个Activity交互

    1. **启动Service:** Activity可以通过startService()方法启动一个Service,Service会在后台持续运行,直到stopSelf()或stopService()被调用。 2. **绑定Service:** 使用bindService()方法,Activity可以与Service...

    Service 启动与停止

    2. bindService(): 这种方式启动的Service会执行onBind()方法,主要用于客户端(如Activity)和服务端(Service)之间的绑定交互。当所有客户端都解绑后,系统会自动停止Service。 三、Service生命周期 1. onCreate...

    activity service 数据交互

    启动Service时,可以在Intent中添加额外的数据,Service通过onStartCommand()方法获取这些数据。同样,Service可以通过startActivityForResult()或startActivity()向Activity发送Intent,传递结果数据。 2. **...

    android service 通过broadcast通知activity

    本主题将深入探讨如何使用Service以及BroadcastReceiver来实现特定的功能:当Service检测到某个函数的状态变化时,通过Broadcast发送通知,进而启动一个新的Activity。 首先,让我们了解`Service`。在Android中,...

Global site tag (gtag.js) - Google Analytics