安卓接收器&通知

时间:2016-09-17 12:08:30

标签: android notifications broadcastreceiver android-notifications

下面的代码是接收器类

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;


public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("the time is right","yay!");
        Intent i = new Intent(context.getApplicationContext() , AlarmServie.class);
        context.startService(i);
    }
}

以下代码是我的服务类

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.util.Log;

public class AlarmServie extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.e("hello","hi" );
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
        Log.e("onCreate:","came" );
     /*  NotificationManager notifyman = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Intent main_activity = new Intent(this.getApplicationContext(), MainActivity.class);
        PendingIntent o = PendingIntent.getActivity(this, 0, main_activity, 0);

        /*Notification noti = new Notification.Builder(this)
                .setContentTitle("Reminder to Pill")
                .setContentText("Click for info")
                .setAutoCancel(true)
                .setContentIntent(o)v
                .build();*/
        NotificationManager nm = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
        Intent in = new Intent(this.getApplicationContext(), MainActivity.class);
        PendingIntent pending = PendingIntent.getActivity(this, 0, in, 0);
        NotificationCompat.Builder mBuilder =new NotificationCompat.Builder(AlarmServie.this);
        mBuilder.setContentTitle("Pill Reminder");
        mBuilder.setContentText("CLick here to View");
        //mBuilder.setSound(sound);

        TaskStackBuilder ts=TaskStackBuilder.create(this);
        ts.addParentStack(MainActivity.class);
        nm.notify(9999,mBuilder.build());
        return START_STICKY;
    }}

以下代码是我的清单

<uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />



            </intent-filter>
        </activity>


        <receiver
                  android:name=".AlarmReceiver"
                  android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>

        </receiver>

        <activity android:name=".Set">

        </activity><!-- ATTENTION: This was auto-generated to add Google Play services to your project for
     App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information. -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />


            <service
                android:name=".AlarmServie"
                android:enabled="true"/>




    </application>

</manifest>

我使用了一个文本框和一个计时器按钮来获取用户的文本和时间,并将其保存在数据库中。当db和系统时间匹配通知的时间必须到来但是它没有来,任何人都可以说为什么会发生这种情况。明确解释这是通过使用代码

详细解释而发生的

这是我的主要活动

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import com.google.android.gms.common.api.GoogleApiClient;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;


public class MainActivity extends AppCompatActivity {
    Sqlitedb dbobj1;
    int gh;
    AlarmManager am;


    Calendar c;
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        dbobj1 = new Sqlitedb(MainActivity.this);
        gh = (int) dbobj1.number();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        Calendar c = Calendar.getInstance();

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, Set.class);
                startActivity(intent);
            }
        });
        Intent my_intent = new Intent(MainActivity.this, AlarmServie.class);


        am = (AlarmManager) getSystemService(ALARM_SERVICE);
        Date dt = new Date();
        int hour=dt.getHours();
        int min=dt.getMinutes();
        PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, my_intent, PendingIntent.FLAG_UPDATE_CURRENT);
        Cursor t = dbobj1.recenttime(hour,min);
        t.moveToFirst();
        c.set(Calendar.HOUR_OF_DAY, t.getInt(0));
        c.set(Calendar.MINUTE, t.getInt(1));
        am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);


        populate();

    }
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        //client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    //oncreate ends here


    class customAdabter extends ArrayAdapter<setget> {
        Context _context;
        List<setget> _li;

        public customAdabter(Context con, int layout, List<setget> li) {
            super(con, layout, li);
            _context = con;
            _li = li;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            gh++;
            LayoutInflater layu = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View v = layu.inflate(R.layout.item, null);


            TextView txt = (TextView) v.findViewById(R.id.item_textview1);
            TextView txt1 = (TextView) v.findViewById(R.id.item_textview2);
            Button btt = (Button) v.findViewById(R.id.item_button1);
            btt.setId(gh);

            btt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    int r = v.getId();
                    dbobj1.deleteRow(r);

                    populate();

                }
            });

            setget dataobj = _li.get(position);

            txt.setText(dataobj.getPn());
            txt1.setText(dataobj.getPt());

            return v;
        }
    }


    public void populate() {
        List<setget> li = new ArrayList<setget>();

        for (int i = 1; i <= dbobj1.number(); i++) {
            setget obj = new setget();
            Cursor c = dbobj1.getRow(i);
            String name = c.getString(c.getColumnIndex("pillname"));
            String time = c.getString(c.getColumnIndex("pilltime"));
            obj.setPn(name);
            obj.setPt(time);
            c.close();
            li.add(obj);
        }
        ListView lv = (ListView) findViewById(R.id.listview);
        customAdabter customobj = new customAdabter(MainActivity.this, R.layout.item, li);
        lv.setAdapter(customobj);

    }
}

这是logcat

09-19 11:30:32.267 19426-19426/com.example.ashwin.pillreminder11 D/ActivityThread: BDC-Calling onReceive: intent=Intent { flg=0x114 cmp=com.example.ashwin.pillreminder11/.AlarmReceiver (has extras) }, receiver=com.example.ashwin.pillreminder11.AlarmReceiver@d5ea50b

09-19 11:30:32.267 19426-19426/com.example.ashwin.pillreminder11 E/the time is right: yay!

09-19 11:30:32.268 19426-19426/com.example.ashwin.pillreminder11 D/ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { flg=0x114 cmp=com.example.ashwin.pillreminder11/.AlarmReceiver (has extras) } packageName=com.example.ashwin.pillreminder11 resultCode=0 resultData=null resultExtras=null}

1 个答案:

答案 0 :(得分:0)

<receiver
        android:name=".AlarmReceiver"
        android:enabled="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
</receiver>

将其更改为

<receiver
      android:name=".AlarmReceiver"
      android:enabled="true">
</receiver>

并使用不同的广播接收器接收BOOT_COMPLETED广播并重置所有警报。