In previous articles, the listener that receives text messages will always be in the background. Even if the program is disabled, the listener will always exist and activate the main program when receiving the message. In general design, this is not the case because it is a waste of resources and does not provide a good user experience. Therefore, you need to cancel the listener after the program is closed. Previous Link (click to enter) 1. Create a backend service to receive messages and broadcast the messages to broadcastreceiver. Because the service can be terminated, messages will not be forwarded when the service is terminated, and the broadcastreceiver in the background will not take effect and will be automatically recycled by GC. The program's goal has also been achieved Package com. Demo; Import Android. App. Service; Import Android. content. broadcastreceiver; Import Android. content. context; Import Android. content. intent; Import Android. content. intentfilter; Import Android. OS. Bundle; Import Android. OS. ibinder; Import Android. telephony. GSM. smsmessage; Public class listenservice extends Service { Public static final string svrid = "rarnu. Service. Demo "; Public static final string stract = "android. provider. telephony. sms_received "; Private smsmsgreceiver Recv; @ Override Public void onstart (intent, int startid ){ Super. onstart (intent, startid ); } @ Override Public void oncreate (){ Intentfilter filter = new intentfilter (stract ); Recv = new smsmsgreceiver (); Registerreceiver (Recv, filter ); Super. oncreate (); } @ Override Public ibinder onbind (intent ){ Return NULL; } @ Override Public void ondestroy (){ Unregisterreceiver (Recv ); Super. ondestroy (); } Public class smsmsgreceiver extends broadcastreceiver { @ Override Public void onreceive (context, intent ){ If (intent. getaction (). Equals (stract )){ Stringbuilder sb = new stringbuilder (); Bundle bundle = intent. getextras (); If (bundle! = NULL ){ Object [] PDUS = (object []) bundle. Get ("PDUS "); Smsmessage [] MSG = new smsmessage [PDUS. Length]; For (INT I = 0; I <PDUS. length; I ++ ){ MSG [I] = smsmessage. createfrompdu (byte []) PDUS [I]); } For (smsmessage currmsg: MSG ){ SB. append ("from :"); SB. append (currmsg. getdisplayoriginatingaddress ()); SB. append ("\ nmessage :"); SB. append (currmsg. getdisplaymessagebody ()); } } Intent I = new intent (svrid ); I. putextra ("Param", SB. tostring ()); Sendbroadcast (I ); } } } } As you can see, the code for Receiving text messages in the previous article is copied to the service code. The only difference is that the sendbroadcast () is added to the service () Ii. Modify broadcastreceiver Package com. Demo; Import Android. content. broadcastreceiver; Import Android. content. context; Import Android. content. intent; Import Android. OS. Bundle; Import Android. widget. Toast; Public class messagereceiver extends broadcastreceiver { Public static final string svrid = "rarnu. Service. Demo "; @ Override Public void onreceive (context, intent ){ If (intent. getaction (). tostring (). Equals (svrid )){ Bundle Bund = intent. getextras (); String strparam = ""; If (Bund! = NULL ){ Strparam = Bund. getstring ("Param "); } Intent I = new intent (context, msglisten. Class ); I. setflags (intent. flag_activity_new_task ); Toast. maketext (context, strparam, Toast. length_short). Show (); Context. startactivity (I ); } } } The text message receiving code is moved to the service, so broadcastreceive naturally does not need that code and can directly retrieve the service string from extras. Iii. start and end Package com. Demo; Import Android. App. activity; Import Android. content. intent; Import Android. OS. Bundle; Public class msglisten extends activity { @ Override Public void oncreate (bundle savedinstancestate ){ Super. oncreate (savedinstancestate ); Setcontentview (R. layout. Main ); } @ Override Protected void onresume (){ Intent I = new intent (msglisten. This, listenservice. Class ); I. setflags (intent. flag_activity_new_task ); Startservice (I ); Super. onresume (); } @ Override Protected void onpause (){ Intent I = new intent (msglisten. This, listenservice. Class ); Stopservice (I ); Super. onpause (); } } Start the service in the onresume () event of the program and stop the service in the onpause () event. Then you can try to test the program to see if the program is closed and the text message will not prompt again? |