12

我写了一个获取天气的android服务,AndroidManifest.xml是:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.my.weather"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service
            android:name=".WeatherService"
            android:exported="true" >
        </service>
    </application>

</manifest>

现在,我想让另一个 apk 启动这个服务:

Intent service = new Intent();
service.setClassName("com.my.weather", "com.my.weather.WeatherService");
context.bindService(service, weatherServiceConnection, Context.BIND_AUTO_CREATE);

我收到错误消息:

E/AndroidRuntime(14068): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.test/com.my.test.MainActivity}: java.lang.SecurityException: Not allowed to bind to service Intent { cmp=com.my.weather/.WeatherService }

我该如何解决这个问题?

其他 apk 是使用 Messenger 方法与天气服务通信。

==================================================== ===============================

谢谢大家!

现在我修改我的天气服务的 AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.my.weather"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service
            android:name=".WeatherService"
            android:exported="true"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.my.weather.WeatherService"></action>
            </intent-filter>
        </service>
    </application>

</manifest>

我使用这种方法开始:

Intent service = new Intent("com.my.weather.WeatherService");
context.bindService(service, weatherServiceConnection, Context.BIND_AUTO_CREATE);

然后我收到警告信息:

W/ActivityManager(131): Unable to start service Intent { act=com.my.weather.WeatherService }: not found
4

6 回答 6

12

我有同样的问题。对我来说,问题是我首先使用 API 安装了应用程序,然后是提供 API 的应用程序。卸载/重新安装第一个应用程序解决了这个问题。

更新:为避免该问题,两个应用程序都应在其清单中定义权限。

于 2013-01-07T17:42:17.563 回答
7

这里从文档中说:

如果我们想让该服务在远程进程中运行(而不是其 .apk 的标准进程),我们可以android:process在其清单标签中指定一个:

<service android:name=".app.MessengerService"
        android:process=":remote" />

另请注意,remote此处选择的名称是任意的,如果您需要其他进程,可以使用其他名称。前缀将:名称附加到包的标准进程名称。完成后,客户端现在可以绑定到服务并向其发送消息。请注意,这允许客户端向其注册以接收返回的消息。

Edit1
其次,如果服务元素(在清单中)包含操作字符串,请使用它。例如,如果您的服务声明如下:

<service android:name="com.sample.service.serviceClass"  
            android:exported="true" android:label="@string/app_name" 
            android:process=":remote">
   <intent-filter><action android:name="com.sample.service.serviceClass"></action>
   </intent-filter>
</service>         

因此,请在onCreate()您的服务方法中执行此操作:

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent=new Intent("com.sample.service.serviceClass");  
      this.startService(intent);
}

我在这个问题中看到了这一点:
无法启动服务意图

Edit2
我再次看到了您的清单。您的清单似乎没有 .InMain/Launcher Activityandroid 3.1 and later导致没有可用的服务。这需要一个主/启动器活动。所以你必须将这样的活动添加到你的应用程序中,并注意它已经被执行。In fact forsecurityreason all services,receivers,... that you declare in manifest,will not register unless your App run explicitly by user

于 2012-08-17T14:51:19.547 回答
2

向 WeatherService 添加带有操作的意图过滤器:

<service
    android:name=".WeatherService"
    android:exported="true" >
    <intent-filter>
        <action android:name="this.is.my.custom.ACTION" />
    </intent-filter>
</service>

然后,当您在其他应用程序中使用 bindService() 进行绑定时,请使用以下意图:

new Intent("this.is.my.custom.ACTION")
于 2012-08-17T15:12:26.423 回答
0

在您的活动类中...假设 BothButton 是活动类名,而 CleverTexting 是服务类名,并且您想从服务中调用活动,而不是从活动中调用服务。如果您的代码在超过 4.0 的 android 版本中运行良好,那么您可以这样做不会有任何问题。

CleverTexting mService ; 

public void setService(CleverTexting listener) {
    // TODO Auto-generated method stub
     mService = listener;
}

在你的服务课上做......你想在哪里打电话给你的活动

BothButton mBothButton;

mBothButton = new BothButton(this);
    mBothButton.setService(this);
于 2013-09-05T04:29:06.047 回答
0

当您为远程服务调用 bindService 时,您也应该设置您的 packageName。

Intent intent = new Intent("com.my.weather.WeatherService");
intent.setPackage("com.my.weather");
bindService(intent, serConn, Context.BIND_AUTO_CREATE);
于 2019-05-23T08:16:48.103 回答
0

David Wasser 在评论中解决了我的问题,所以我想我分享一下。

在清单中,您可以将导出的属性设置为 true。这使得其他应用程序可以访问该服务。

清单.xml

<service android:name=".MyUsefulService_"
                android:exported="true"/>

我的活动.java

Intent intent = new Intent();
intent.setComponent(new ComponentName("jav.android.app",jav.android.app.MyUsefulService_");

bindService(this,MyServiceConnection,0);
于 2020-01-28T01:12:47.057 回答