Приложение Android не запускается Сервис - PullRequest
3 голосов
/ 23 декабря 2010

Эй, я пытаюсь внедрить службу в моем приложении для Android.И Служба должна выполнять ту же задачу, что и Деятельность.То есть, если в поставщике контента CallLog.Calls происходят какие-то изменения, служба должна быть уведомлена и вставить данные в базу данных, даже если приложение не запущено, то есть служба будет работать после запуска приложения, поэтому, еслиприложение убито, служба будет работать до тех пор, пока ОС не остановит его, верно?

Так что оно будет работать в фоновом режиме, собирая все данные, которые изменяются в службе CallLog.Calls.Но служба не работает.Я отмечаю это в методе onCreate () Activity.А внутри Службы я реализовал класс ContentObserver, который использует метод onChange () на случай каких-то изменений в поставщике контента CallLog.Calls.

Что я не знаю, так это почему Служба не запущена и почемуэто не работает, даже если я убью приложение в перспективе DDMS.

Вот код.

Деятельность называется RatedCalls.java

public class RatedCalls extends ListActivity {

private static final String LOG_TAG = "RATEDCALLSOBSERVER";
private Handler handler = new Handler();
private SQLiteDatabase db;
private CallDataHelper cdh;
StringBuilder sb = new StringBuilder();
OpenHelper openHelper = new OpenHelper(RatedCalls.this);
private Integer contentProviderLastSize;
private Integer contentProviderCurrentSize;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    cdh = new CallDataHelper(this);
    db = openHelper.getWritableDatabase();

    startService(new Intent(this, RatedCallsService.class));
    registerContentObservers();

    Log.i("FILLLIST", "calling from onCreate()");

    Cursor cursor = getContentResolver().query(
            android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
            android.provider.CallLog.Calls.DATE + " DESC ");

    contentProviderLastSize = cursor.getCount();

}

class RatedCallsContentObserver extends ContentObserver {
    public RatedCallsContentObserver(Handler h) {
        super(h);
    }

    @Override
    public boolean deliverSelfNotifications() {
        return true;

    }

    @Override
    public void onChange(boolean selfChange) {
        Log.d(LOG_TAG, "RatedCallsContentObserver.onChange( " + selfChange
                + ")");
        super.onChange(selfChange);
        searchInsert();

    }
}

private void searchInsert() {

    Cursor cursor = getContentResolver().query(
            android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
            android.provider.CallLog.Calls.DATE + " DESC ");

    Log.i("FILLLIST", "Calling from searchInsert");

    startManagingCursor(cursor);
    int numberColumnId = cursor
            .getColumnIndex(android.provider.CallLog.Calls.NUMBER);
    int durationId = cursor
            .getColumnIndex(android.provider.CallLog.Calls.DURATION);
    int contactNameId = cursor
            .getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
    int numTypeId = cursor
            .getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE);

    Date dt = new Date();
    int hours = dt.getHours();
    int minutes = dt.getMinutes();
    int seconds = dt.getSeconds();
    String currTime = hours + ":" + minutes + ":" + seconds;

    SimpleDateFormat dateFormat = new SimpleDateFormat("M/dd/yyyy");
    Date date = new Date();

    cursor.moveToFirst();           

            String contactNumber = cursor.getString(numberColumnId);
            String contactName = cursor.getString(contactNameId);
            String duration = cursor.getString(durationId);
            String numType = cursor.getString(numTypeId);
            stopManagingCursor(cursor);
            ContentValues values = new ContentValues();

            values.put("contact_id", 1);
            values.put("contact_name", contactName);
            values.put("number_type", numType);
            values.put("contact_number", contactNumber);
            values.put("duration", duration);
            values.put("date", dateFormat.format(date));
            values.put("current_time", currTime);
            values.put("cont", 1);

            db.insert(CallDataHelper.TABLE_NAME, null, values);         
}
    public void registerContentObservers() {

    this.getApplicationContext()
            .getContentResolver()
            .registerContentObserver(
                    android.provider.CallLog.Calls.CONTENT_URI, true,
                    new RatedCallsContentObserver(handler));

}

И эта служба называется RatedCallsService.java

public class RatedCallsService extends Service {

private static final String TAG = "RatedCallsService";
private static final String LOG_TAG = "RatedCallsService";
private Handler handler = new Handler();
private SQLiteDatabase db;
private CallDataHelper cdh;
OpenHelper openHelper = new OpenHelper(RatedCallsService.this);

class RatedCallsContentObserver extends ContentObserver {
    public RatedCallsContentObserver(Handler h) {
        super(h);
    }

    @Override
    public boolean deliverSelfNotifications() {
        return true;

    }

    @Override
    public void onChange(boolean selfChange) {
        Log.d(LOG_TAG, "RatedCallsContentObserver.onChange( " + selfChange
                + ")");
        super.onChange(selfChange);
        searchInsert();

    }
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {

    Toast.makeText(this, "Rated Calls Service Created", Toast.LENGTH_LONG).show();
    Log.i(TAG, "onCreate");
    registerContentObservers();

}

@Override
public void onDestroy() {

    Toast.makeText(this, "Rated Calls Service Stopped", Toast.LENGTH_LONG).show();
    Log.i(TAG, "onDestroy");
    cdh = new CallDataHelper(this);
    db = openHelper.getWritableDatabase();

}

@Override
public void onStart(Intent intent, int startid) {

    Toast.makeText(this, "Rated Calls Service Started", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onStart");      
    registerContentObservers();

}

private void searchInsert() {

    Cursor cursor = getContentResolver().query(
            android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
            android.provider.CallLog.Calls.DATE + " DESC ");

    Log.i("FILLLIST", "Calling from searchInsert");

    int numberColumnId = cursor
            .getColumnIndex(android.provider.CallLog.Calls.NUMBER);
    int durationId = cursor
            .getColumnIndex(android.provider.CallLog.Calls.DURATION);
    int contactNameId = cursor
            .getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
    int numTypeId = cursor
            .getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE);

    Date dt = new Date();
    int hours = dt.getHours();
    int minutes = dt.getMinutes();
    int seconds = dt.getSeconds();
    String currTime = hours + ":" + minutes + ":" + seconds;

    SimpleDateFormat dateFormat = new SimpleDateFormat("M/dd/yyyy");
    Date date = new Date();

    if (cursor.moveToFirst()) {
        do {

            String contactNumber = cursor.getString(numberColumnId);
            String contactName = cursor.getString(contactNameId);
            String duration = cursor.getString(durationId);
            String numType = cursor.getString(numTypeId);           
            ContentValues values = new ContentValues();

            values.put("contact_id", 1);
            values.put("contact_name", contactName);
            values.put("number_type", numType);
            values.put("contact_number", contactNumber);
            values.put("duration", duration);
            values.put("date", dateFormat.format(date));
            values.put("current_time", currTime);
            values.put("cont", 1);

            db.insert(CallDataHelper.TABLE_NAME, null, values);

        } while (cursor.moveToNext());
        cursor.close();
    }
}


public void registerContentObservers() {

    this.getApplicationContext()
            .getContentResolver()
            .registerContentObserver(
                    android.provider.CallLog.Calls.CONTENT_URI, true,
                    new RatedCallsContentObserver(handler));

}

 }

Ответы [ 4 ]

19 голосов
/ 23 декабря 2010

Просто посмотрите, добавили ли вы эту Службу в файл манифеста .......

Спасибо .......

5 голосов
/ 27 февраля 2013

При объявлении службы в манифесте попробуйте использовать полное местоположение пакета вашего класса обслуживания в манифесте.

например. <service android:name="com.company.project.package.MyService">

Мой сервис не запускался, и это сработало для меня.

1 голос
/ 23 декабря 2010

Привет вместо того, чтобы использовать службу и обозреватель контента, я бы наблюдал за состоянием телефона. Наблюдение за состоянием телефона может вызвать вашу службу обновлений.

Вам нужен

android.permission.READ_PHONE_STATE

разрешение. это не большое дело.

Код для приемника вещания:

    public class CallStateWatcher extends BroadcastReceiver
{



    @Override
    public void onReceive(Context context, Intent intent)
    {

        if (intent.getAction().equals(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED))
        {
            String extra = intent.getStringExtra(android.telephony.TelephonyManager.EXTRA_STATE);

            if (extra.equals(android.telephony.TelephonyManager.EXTRA_STATE_OFFHOOK))
            {
                // do something
            }
            if (extra.equals(android.telephony.TelephonyManager.EXTRA_STATE_IDLE))
            {
                // do something

            }   

        }
    }
}

Вы должны определить этот получатель

<receiver
        android:name=".core.watcher.CallStateWatcher">
        <intent-filter>
            <action
                android:name="android.intent.action.PHONE_STATE"></action>

        </intent-filter>
    </receiver>
1 голос
/ 23 декабря 2010

Возможно, вы захотите проверить документацию жизненный цикл . Если вы вызываете Context.startService (), служба должна запускаться и работать до тех пор, пока кто-нибудь не скажет, чтобы она остановилась.

Из вашего примера кода похоже, что вы это делаете. С чего вы взяли, что сервис не запускается?

Я не уверен, что вы ожидаете, когда убьете приложение ... Похоже, это хорошая причина, чтобы оно не работало.

...