0

コンテンツプロバイダーからの通話ログ、SMSログなどのシステムメトリックを読み取る小さなプロジェクトがあります。

コンテンツプロバイダーから読み取り、(Call / SMS)Metricsクラスのオブジェクトに情報を保存するために、 (Call / SMS)Loggerクラスを作成しました。

MainActivityは、 (Call / SMS)Metricsクラスのオブジェクトの情報を使用し、databaseOpenHelperクラスを使用して自分のデータベースにデータを保存します。

ここで、CursorLoaderを使用してコンテンツプロバイダーからデータをロードする予定です。

私が見た例は、MainActivityがLoaderManager.LoaderCallbacksを実装していることを示唆しています

実際のクエリが非アクティビティクラスで行われる場合、プロジェクトでこれをどのように使用できますか?

アクティビティでI1loaderMangerを作成し、アクティビティ以外のすべてに使用できますか?

サンプルコードスニペットは次のとおりです。

メインアクティビティからデータのコレクションを呼び出し、コンテキストをclssessに渡して、マネージャーカーソルで使用できるようにします。

private void CollectSystemMetrics() {
    //passing the context in constructor so that it can be passed to 
    //the non activity classes which need it for quering
    SystemMetricsCollector collector = new SystemMetricsCollector(this);        
    _callMetrics = collector.CollectCallMetrics();
    _smsMetrics = collector.CollectSMSMetrics();

    Toast toast = Toast.makeText(
            MyActivity.this,
            "Calls and SMS Data Collected",
            Toast.LENGTH_SHORT);
    toast.show();
} 

SMSDataをレイドするSystemMetricsCollectorのメソッド

public SMSMetrics CollectSMSMetrics() {
    SMSLogger smsLogger = new SMSLogger(_context);
    smsLogger.ReadSMSDataFromPhone();
    return smsLogger.GetSMSMetrics();
}

SMSLoggerクラスの変数。

Uri smsUri = Uri.parse("content://sms");
String[] selectColumns = null;
String where = null;
String whereArgs[] = null;
String sortBy = null;

カーソルを使用してデータを読み取るSMSLoggerのメソッド

public void ReadSMSDataFromPhone() {
    int inCount = 0, outCountContacts = 0, outCountUnknown = 0;
    Cursor managedCursor;
    managedCursor = _context.getContentResolver().query(
            smsUri,selectColumns,where,whereArgs,sortBy);
    try {
        if (managedCursor.moveToFirst()) {
            int idxAddress = managedCursor.getColumnIndexOrThrow("address");
            int idxType = managedCursor.getColumnIndex("type");
            do {
                int valType = managedCursor.getInt(idxType);
                switch (valType) {
                    case 2://outgoing
                        String valAddress = 
                        managedCursor.getString(idxAddress);
                        if (isContact(valAddress)) outCountContacts++;
                        else outCountUnknown++;
                        break;
                    default://incoming
                        inCount++;
                        break;
                }
            } while (managedCursor.moveToNext());
        }
    } finally {
        managedCursor.close();
    }//end finally
    _smsMetrics.set_receivedSMS(inCount);
    _smsMetrics.set_sentSMSContacts(outCountContacts);
    _smsMetrics.set_sentSMSUnknown(outCountUnknown);
}
4

2 に答える 2

3

実際のクエリが非アクティビティ クラスで行われる場合、プロジェクトでこれをどのように使用できますか?

を実際に使用するアクティビティにするか、使用LoadersしないかのいずれかですLoaders。orの代わりにaContentResolverを使用してもかまいません。AsyncTaskThread

于 2012-11-17T17:45:06.247 に答える
0

あなたのユースケースが何であるかについては100%確信が持てませんが...

LoaderCallbacks を実装するアクティビティのポイントは、使いやすさです。必要な場所で LoaderCallbacks を宣言し、それを loaderManager に渡すだけです。

LoaderCallbacks blah = new LoaderCallbacks() {
//Override methods here
}

getLoaderManager().initLoader(LOADER_ID, null, blah);    

ただし、getLoaderManager()通常はフラグメントまたはアクティビティに関連付けられていることに注意してください。

于 2012-11-17T14:48:19.847 に答える