Không thể bắt đầu Ý định dịch vụ


81

Tôi có một lớp dịch vụ. Tôi đã xuất lớp này sang jar và tôi đã nhúng jar vào ứng dụng khách của mình.

Khi cần, tôi gọi lớp dịch vụ. Khi tôi cố gắng thực hiện việc này, tôi gặp lỗi sau:

Unable to start service Intent {comp={com.sample.service/com.sample.service.serviceClass}} : not found

Tôi có lớp khác ngoài lớp dịch vụ, mà tôi có thể truy cập (tạo đối tượng của lớp đó) nằm trong cùng một jar.

Tôi cảm thấy mình đã bỏ lỡ một số điều trong cấu hình hoặc tệp kê khai của mình hoặc tương tự.

Vui lòng giúp tôi xác định giống nhau. Mã của tôi ở dưới đây:

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent = new Intent () ;  
      intent.setClassName("com.sample.service" ,"com.sample.service.serviceClass") ;  
      this.startService(intent) ; // when I call this line I get the message...  
      // binding other process continue  here   
}

Máy khách tệp kê khai.xml

<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>

Cảm ơn trước
nhé Vinay


Tôi đã cố gắng sửa mã của bạn nhưng trong nguồn có vấn đề mà tôi cảm thấy tôi không hiểu đủ để thử nó. Về cơ bản, bạn có một khoảng trống thừa trong <service ...>, nó phải là <service ...>, nhưng nếu bạn nhìn vào nguồn, bạn có một '/' trước hai câu lệnh nhập và tôi không chắc liệu chúng có được cho là ở đó. Tôi nghĩ khoảng trắng sau dấu '<' sẽ là nguyên nhân gây ra vấn đề của bạn.
James Black

Cảm ơn james đã trả lời. Những không gian đó được cố ý chỉ để hiển thị trong trang web. Bên trong mã, không có khoảng trắng bên trong các thẻ. Ngay cả "\" cũng chỉ để hiển thị đúng trên trang web .. Về cơ bản, tôi không gặp bất kỳ lỗi biên dịch nào trong eclipse. Chỉ trong thời gian chạy, tôi nhận được thông báo trong LogCat
Vinay

Câu trả lời:


48

Đầu tiên, bạn không cần android:process=":remote" , vì vậy hãy xóa nó đi, vì tất cả những gì nó sẽ làm là chiếm thêm RAM mà không có lợi.

Thứ hai, vì <service>phần tử chứa một chuỗi hành động, hãy sử dụng nó:

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

Ông Mark thân mến, tôi đã thêm điều khiển từ xa vì tôi cần truy cập cùng một nội dung từ các ứng dụng khác nhau. Tôi bao gồm điều này sau khi đọc trên web rằng tốt hơn là nên triển khai một dịch vụ từ xa. Tôi đã sửa đổi theo đề xuất của bạn và hiện tại nó hoạt động tốt. Một lần nữa xin cảm ơn.
Vinay

2
@Vinay: "Tôi cần truy cập cùng một nội dung từ các ứng dụng khác nhau." Bạn vẫn không cần android:process=":remote", vì vậy hãy xóa nó đi, vì tất cả những gì nó sẽ làm là chiếm thêm RAM mà không có lợi. Dịch vụ từ xa là dịch vụ cung cấp API qua AIDL và không liên quan gì đến android:processthuộc tính. Đây là một dịch vụ từ xa mẫu: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/… và đây là ứng dụng khách tương ứng của dịch vụ đó: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ …
CommonsWare

72

Đối với bất kỳ ai khác xem qua chủ đề này, tôi đã gặp vấn đề này và đang nhổ tóc. Tôi đã có khai báo dịch vụ BÊN NGOÀI của thẻ đóng '<application>' DUH!

ĐÚNG:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ...>
...
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity ...>
        ...
    </activity>    

    <service android:name=".Service"/>

    <receiver android:name=".Receiver">
        <intent-filter>
            ...
        </intent-filter>
    </receiver>        
</application>

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

SAI nhưng vẫn biên dịch không có lỗi:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ...>
...
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity ...>
        ...
    </activity>

</application>

    <service android:name=".Service"/>

    <receiver android:name=".Receiver">
        <intent-filter>
            ...
        </intent-filter>
    </receiver>        

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


7
Điều này nghe có vẻ giống như một công việc cho một lint android nâng cao mắc phải những lỗi đơn giản này! Mà cuối cùng chúng ta có thể nhận được.
Ehtesh Choudhury

1
Tôi đã viết sai chính tả tên dịch vụ trong xml! Điều này đã cho tôi manh mối vấn đề nằm ở đâu. thanx
Arvand

Cảm ơn đã đăng câu trả lời của bạn. Điều này cuối cùng đã giải quyết được dịch vụ không bắt đầu.
pmont,

WOW! Cám ơn rất nhiều. Tại sao nó không hoạt động trong thẻ <application>?
Ruchir Baronia

IDE không phàn nàn về thẻ <service> sai chính tả. Chúng tôi cũng đã mắc sai lầm về nó.
Yeung

32

1) kiểm tra xem khai báo dịch vụ trong tệp kê khai có được lồng trong thẻ ứng dụng không

<application>
    <service android:name="" />
</application>

2) kiểm tra xem của bạn service.javađang ở trong cùng một gói hay gói khác với hoạt động

<application>
    <!-- service.java exists in diff package -->
    <service android:name="com.package.helper.service" /> 
</application>
<application>
    <!-- service.java exists in same package -->
    <service android:name=".service" /> 
</application>

1
có dấu chấm hay không? trong trường hợp của tôi: không phải, thay vào đó tôi sử dụng <service android: name = "service" /> và nó hoạt động. nhìn thấy stackoverflow.com/questions/2265020/…
DiveInto vào

với dấu chấm, nó cũng sẽ hoạt động vì ở trên cùng, bạn xác định đường dẫn gói của mình
Jianhong

3
Dude, cảm ơn rất nhiều vì câu trả lời của bạn. Tôi đã phải vật lộn với một vấn đề phức tạp và hóa ra dịch vụ của tôi ở một gói khác. Nếu tôi có thể ôm bạn, tôi sẽ!
racl101

1
Điểm thứ 2 đã giúp. Cảm ơn bro rất nhiều, cố gắng nứt nó trong 1 ngày đầy đủ :( ngớ ngẩn mặc dù.
Archie.bpgc

5

Tôi hy vọng tôi cũng có thể giúp ai đó về thông tin này: Tôi đã chuyển lớp dịch vụ của mình sang một gói khác và tôi đã sửa các tham chiếu. Dự án hoàn toàn ổn, NHƯNG hoạt động không thể tìm thấy lớp dịch vụ.

Bằng cách xem nhật ký trong logcat, tôi nhận thấy cảnh báo về vấn đề: hoạt động không thể tìm thấy lớp dịch vụ, nhưng điều buồn cười là gói không chính xác, nó chứa ký tự "/". Trình biên dịch đang tìm kiếm

com.something./service.MyService

thay vì

com.something.service.MyService

Tôi đã chuyển lớp dịch vụ ra khỏi gói và quay lại và mọi thứ hoạt động tốt.


Đầu tiên, tôi nghĩ đó là một lỗi nhưng nếu bạn tiếp tục xem các mục logcat, bạn sẽ thấy nó nhiều lần và tất cả các ứng dụng đó đều hoạt động hoàn hảo.
Axxiss

1
tốt, tôi không thể phủ nhận trải nghiệm của bạn nhưng của tôi hơi khác một chút và bằng cách di chuyển vào và ra lại lớp từ gói, eclipse đã sửa lỗi của chính nó;) và tôi không có ngoại lệ thời gian chạy.
sataniccrow

2
Tôi phải nói rằng nó cũng hiệu quả với tôi. Vấn đề kỳ lạ, tôi đã mất nửa giờ để tìm bình luận của chúng tôi. Cảm ơn!
Alex RR

Tôi nghĩ rằng tôi cũng gặp vấn đề tương tự, nhưng tôi không thể khắc phục nó bằng cách di chuyển tệp lớp ...
seb

Đây là vấn đề cụ thể của tôi. Rất khó để tìm ra nhưng / trong tên dịch vụ là một manh mối. Nếu dịch vụ của bạn đột ngột ngừng hoạt động hoặc không hoạt động trong một lần kiểm tra mới, đây rất có thể là nguyên nhân (và giải pháp).
Hayes Haugen

0

Trong trường hợp của tôi, giới hạn tối đa 1 MB cho việc vận chuyển dữ liệu bằng Intent. Tôi sẽ chỉ sử dụng Cache hoặc Storage.


0

Tôi đã tìm thấy cùng một vấn đề. Tôi đã mất gần một ngày cố gắng bắt đầu một dịch vụ từ OnClickListenerphương pháp - bên ngoài onCreatevà sau 1 ngày, tôi vẫn thất bại !!!! Rất bực bội! Tôi đang xem ví dụ mẫu RemoteServiceController. Của họ hoạt động, nhưng triển khai của tôi không hoạt động!

Cách duy nhất có hiệu quả với tôi là từ onCreatephương pháp bên trong . Không có biến thể nào khác hoạt động và hãy tin tôi rằng tôi đã thử tất cả chúng.

Phần kết luận:

  • Nếu bạn đặt lớp dịch vụ của mình trong gói khác với mainActivity, tôi sẽ gặp tất cả các loại lỗi
  • Ngoài ra, một "/" không thể tìm thấy đường dẫn đến dịch vụ, đã thử bắt đầu bằng Intent(package,className)và không có gì, cũng có loại Ý định bắt đầu khác

  • Tôi đã chuyển lớp dịch vụ trong cùng một gói của hoạt động Biểu mẫu cuối cùng hoạt động

  • Hy vọng rằng điều này sẽ giúp ai đó bằng cách xác định trình nghe onClickbên trong onCreatephương thức như sau:

    public void onCreate() {
    //some code......
        Button btnStartSrv  = (Button)findViewById(R.id.btnStartService);
        Button btnStopSrv  = (Button)findViewById(R.id.btnStopService);
    
        btnStartSrv.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                startService(new Intent("RM_SRV_AIDL"));
            }
        });
    
        btnStopSrv.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                stopService(new Intent("RM_SRV_AIDL"));
            }
        });
    
    } // end onCreate
    

Cũng rất quan trọng đối với tệp Manifest, hãy đảm bảo rằng dịch vụ đó là con của ứng dụng:

<application ... >
    <activity ... >
     ...
    </activity>
    <service
        android:name="com.mainActivity.MyRemoteGPSService"
        android:label="GPSService"
        android:process=":remote">

        <intent-filter>
             <action android:name="RM_SRV_AIDL" />
        </intent-filter>
    </service>
</application>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.