Android 从服务 Class 调用 IntentService class
Android calling IntentService class from a Service Class
我们可以从 运行 服务 class 调用 IntentService class 吗?
Intent myintentservice = new Intent(this, MyIntentService.class);
startService(myintentservice);
我在服务 class 中使用以上代码行来启动 IntentService class。但随后出现以下错误:-
Process: objectdistance.ankeshkjaisansaria.ram.sita.cameratag, PID: 21823
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ComponentName.<init>(ComponentName.java:77)
at android.content.Intent.<init>(Intent.java:4161)
**编辑:------------ **
1.主要 Activity.Java
OnCreate():-
Intent i = new Intent(this, ServiceA.class);
startService(i);
2。 ServiceA.java
public class ServiceA extends Service {
String TAG = "Log";
private static HandlerThread sWorkerThread;
private static Handler sWorkerQueue;
private static DataProviderObserver sDataObserver;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
sWorkerThread = new HandlerThread("ContentObserver");
sWorkerThread.start();
sWorkerQueue = new Handler(sWorkerThread.getLooper());
final ContentResolver r = this.getContentResolver();
if (sDataObserver == null) {
sDataObserver = new DataProviderObserver(getApplicationContext(), sWorkerQueue);
Log.d("CP", " " + android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
r.registerContentObserver(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, sDataObserver);
}
else{Log.d("Error","Error Content Observer Service");}
super.onCreate();
}
public void IntService(){
Intent MyIntentService = new Intent(this, MyIntentService.class);
startService(MyIntentService);
}
@Override
public void onDestroy() {
getContentResolver().unregisterContentObserver(sDataObserver);
super.onDestroy();
}
}
3。 DataProviderObserver.Class
public class DataProviderObserver extends ContentObserver {
Context context;
DataProviderObserver(Context context ,Handler h) {
super(h);
this.context = context;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
if (uri.toString().equals("content://media/external/images/media")){
ServiceA obj1 = new ServiceA();
ob1.IntService();
}
}
@Override
public boolean deliverSelfNotifications() {
return false;
}
}
4. MyIntentService.java
public class MyIntentService extends IntentService {
Context ctx;
public MyIntentService() {
super("test-service");
}
@Override
public void onCreate() {
ctx = getBaseContext();
super.onCreate();
}
@Override
public void onHandleIntent(Intent i){
try {
Uri uri;
Cursor cursor;
int column_index_id , column_index_data;
uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String order = MediaStore.MediaColumns.DATE_ADDED + " desc";
String[] projection = {MediaStore.MediaColumns._ID , MediaStore.MediaColumns.DATA};
cursor = **CONTEXT_REQUIRED**.getContentResolver().query(uri, projection, null, null, order);
column_index_id = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID);
column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
cursor.close();
}catch (Exception e){
e.printStackTrace();
}
// My Task
}
}
我今天回答了另一个,错误完全相同。
ServiceA obj1 = new ServiceA();
ob1.IntService();
您正在尝试创建服务的新对象,这是一种非常非常糟糕的做法。您不能像这样简单地创建一个服务对象。 Android 中的所有服务都必须经历服务生命周期,以便它们具有附加到它们的有效上下文。在这种情况下,有效上下文未附加到 obj1 实例。因此,行
Intent MyIntentService = new Intent(this, MyIntentService.class);
导致空指针,因为 'this' 为空。 (为什么?因为这是指还没有创建的上下文,因为服务没有使用 startService(intent) 启动)
顺便说一句,我不明白您为什么要从服务内部启动 Intent 服务。你可以简单地从 DataProviderObserver class 像这样
Intent MyIntentService = new Intent(context, MyIntentService.class);
context.startService(MyIntentService);
因为上下文存在于 class 中。
我们可以从 运行 服务 class 调用 IntentService class 吗?
Intent myintentservice = new Intent(this, MyIntentService.class);
startService(myintentservice);
我在服务 class 中使用以上代码行来启动 IntentService class。但随后出现以下错误:-
Process: objectdistance.ankeshkjaisansaria.ram.sita.cameratag, PID: 21823
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ComponentName.<init>(ComponentName.java:77)
at android.content.Intent.<init>(Intent.java:4161)
**编辑:------------ **
1.主要 Activity.Java
OnCreate():-
Intent i = new Intent(this, ServiceA.class);
startService(i);
2。 ServiceA.java
public class ServiceA extends Service {
String TAG = "Log";
private static HandlerThread sWorkerThread;
private static Handler sWorkerQueue;
private static DataProviderObserver sDataObserver;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
sWorkerThread = new HandlerThread("ContentObserver");
sWorkerThread.start();
sWorkerQueue = new Handler(sWorkerThread.getLooper());
final ContentResolver r = this.getContentResolver();
if (sDataObserver == null) {
sDataObserver = new DataProviderObserver(getApplicationContext(), sWorkerQueue);
Log.d("CP", " " + android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
r.registerContentObserver(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, sDataObserver);
}
else{Log.d("Error","Error Content Observer Service");}
super.onCreate();
}
public void IntService(){
Intent MyIntentService = new Intent(this, MyIntentService.class);
startService(MyIntentService);
}
@Override
public void onDestroy() {
getContentResolver().unregisterContentObserver(sDataObserver);
super.onDestroy();
}
}
3。 DataProviderObserver.Class
public class DataProviderObserver extends ContentObserver {
Context context;
DataProviderObserver(Context context ,Handler h) {
super(h);
this.context = context;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
if (uri.toString().equals("content://media/external/images/media")){
ServiceA obj1 = new ServiceA();
ob1.IntService();
}
}
@Override
public boolean deliverSelfNotifications() {
return false;
}
}
4. MyIntentService.java
public class MyIntentService extends IntentService {
Context ctx;
public MyIntentService() {
super("test-service");
}
@Override
public void onCreate() {
ctx = getBaseContext();
super.onCreate();
}
@Override
public void onHandleIntent(Intent i){
try {
Uri uri;
Cursor cursor;
int column_index_id , column_index_data;
uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String order = MediaStore.MediaColumns.DATE_ADDED + " desc";
String[] projection = {MediaStore.MediaColumns._ID , MediaStore.MediaColumns.DATA};
cursor = **CONTEXT_REQUIRED**.getContentResolver().query(uri, projection, null, null, order);
column_index_id = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID);
column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
cursor.close();
}catch (Exception e){
e.printStackTrace();
}
// My Task
}
}
我今天回答了另一个
ServiceA obj1 = new ServiceA();
ob1.IntService();
您正在尝试创建服务的新对象,这是一种非常非常糟糕的做法。您不能像这样简单地创建一个服务对象。 Android 中的所有服务都必须经历服务生命周期,以便它们具有附加到它们的有效上下文。在这种情况下,有效上下文未附加到 obj1 实例。因此,行
Intent MyIntentService = new Intent(this, MyIntentService.class);
导致空指针,因为 'this' 为空。 (为什么?因为这是指还没有创建的上下文,因为服务没有使用 startService(intent) 启动)
顺便说一句,我不明白您为什么要从服务内部启动 Intent 服务。你可以简单地从 DataProviderObserver class 像这样
Intent MyIntentService = new Intent(context, MyIntentService.class);
context.startService(MyIntentService);
因为上下文存在于 class 中。