Android:exported là gì

Tôi đã tạo một dịch vụ bị ràng buộc bởi các ứng dụng khác thông qua AIDL và tôi thêm nó vào bảng kê khai như sau: <service android:name=".MyService">    <intent-filter>        <action android:name="org.example.android.myservicedemo.IService" />    </intent-filter></service>

trong đó IService là giao diện AIDL.

Theo cách này, Eclipse cho tôi thấy cảnh báo Dịch vụ đã xuất không yêu cầu sự cho phép . Nếu tôi xóa intent-filter, cảnh báo sẽ biến mất, nhưng rõ ràng các ứng dụng không thể liên kết với dịch vụ.

Cảnh báo này có ý nghĩa gì?

Tôi gặp vấn đề tương tự khi tôi cập nhật SDK lên phiên bản 20 . Tôi đã gỡ bỏ nó bằng cách thêm android: xuất tài sản   android:exported="false"như vậy: <service android:name=".MyService"    android:exported="false">    <intent-filter>        <action android:name="org.example.android.myservicedemo.IService" />    </intent-filter></service>

Xem tài liệu này

Nếu bạn muốn hạn chế sử dụng hoạt động của mình vào ứng dụng của riêng bạn, thì bạn nên thêm exported=falsevào tuyên bố về hoạt động của mình.

Nếu bạn muốn cho phép các ứng dụng khác sử dụng nó (rõ ràng thông qua tên lớp hoặc tốt hơn là bằng cách sử dụng ý định với kiểu dữ liệu hoặc hành động) thì bạn có hai lựa chọn:

  • hạn chế các ứng dụng đó bằng cách sử dụng sự cho phép
  • cho phép tất cả các ứng dụng sử dụng nó, sau đó bạn có thể thêm tools:ignore="ExportedActivity"vào tuyên bố bảng kê khai hoạt động của mình.

-

Lý do tương tự áp dụng cho một dịch vụ, với tools:ignore="ExportedService"và nhà cung cấp nội dung với tools:ignore="ExportedContentProvider".

Như Jens đã nói, "Điều đó có nghĩa là các ứng dụng (tùy ý) khác mà người dùng có trên điện thoại của anh ta có thể liên kết với Dịch vụ của bạn và gọi bất kỳ phương thức nào họ muốn được hiển thị qua giao diện AIDL của bạn."