Title: enhanced IntentService support · Issue #572 · androidannotations/androidannotations · GitHub
Open Graph Title: enhanced IntentService support · Issue #572 · androidannotations/androidannotations
X Title: enhanced IntentService support · Issue #572 · androidannotations/androidannotations
Description: I am often using IntentService objects for background activities in my apps. These IntentService have quite many different ACTIONs in it, which are distinguished by different ACTION strings and different extras. To get a structure in the...
Open Graph Description: I am often using IntentService objects for background activities in my apps. These IntentService have quite many different ACTIONs in it, which are distinguished by different ACTION strings and dif...
X Description: I am often using IntentService objects for background activities in my apps. These IntentService have quite many different ACTIONs in it, which are distinguished by different ACTION strings and dif...
Opengraph URL: https://github.com/androidannotations/androidannotations/issues/572
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"enhanced IntentService support","articleBody":"I am often using **IntentService** objects for background activities in my apps. These IntentService have quite many different ACTIONs in it, which are distinguished by different ACTION strings and different extras.\n\nTo get a structure in the written code I always create an own methods for each action. But I have to write many code by myself that could be wrapped by annotations and would make the code better readable.\n\nI wanna show you this in an example. For this purpose I am using the source code of the FileTransferService of _WifiDirectDemo Sample_ App.\n\n``` java\npublic class FileTransferService extends IntentService {\n\n private static final int SOCKET_TIMEOUT = 5000;\n public static final String ACTION_SEND_FILE = \"com.example.android.wifidirect.SEND_FILE\";\n public static final String EXTRAS_FILE_PATH = \"file_url\";\n public static final String EXTRAS_GROUP_OWNER_ADDRESS = \"go_host\";\n public static final String EXTRAS_GROUP_OWNER_PORT = \"go_port\";\n\n public FileTransferService(String name) {\n super(name);\n }\n\n public FileTransferService() {\n super(\"FileTransferService\");\n }\n\n /*\n * (non-Javadoc)\n * @see android.app.IntentService#onHandleIntent(android.content.Intent)\n */\n @Override\n protected void onHandleIntent(Intent intent) {\n\n Context context = getApplicationContext();\n if (intent.getAction().equals(ACTION_SEND_FILE)) {\n String fileUri = intent.getExtras().getString(EXTRAS_FILE_PATH);\n String host = intent.getExtras().getString(EXTRAS_GROUP_OWNER_ADDRESS);\n Socket socket = new Socket();\n int port = intent.getExtras().getInt(EXTRAS_GROUP_OWNER_PORT);\n\n try {\n Log.d(WiFiDirectActivity.TAG, \"Opening client socket - \");\n socket.bind(null);\n socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT);\n\n Log.d(WiFiDirectActivity.TAG, \"Client socket - \" + socket.isConnected());\n OutputStream stream = socket.getOutputStream();\n ContentResolver cr = context.getContentResolver();\n InputStream is = null;\n try {\n is = cr.openInputStream(Uri.parse(fileUri));\n } catch (FileNotFoundException e) {\n Log.d(WiFiDirectActivity.TAG, e.toString());\n }\n DeviceDetailFragment.copyFile(is, stream);\n Log.d(WiFiDirectActivity.TAG, \"Client: Data written\");\n } catch (IOException e) {\n Log.e(WiFiDirectActivity.TAG, e.getMessage());\n } finally {\n if (socket != null) {\n if (socket.isConnected()) {\n try {\n socket.close();\n } catch (IOException e) {\n // Give up\n e.printStackTrace();\n }\n }\n }\n }\n\n }\n }\n}\n```\n\nIn my opinion the whole onHandleIntent method could be generated automatically and the annotated class could look like the following:\n\n``` java\n@EIntentService\npublic class FileTransferService extends IntentService {\n private static final int SOCKET_TIMEOUT = 5000;\n public static final String ACTION_SEND_FILE = \"com.example.android.wifidirect.SEND_FILE\";\n public static final String EXTRAS_FILE_PATH = \"file_url\";\n public static final String EXTRAS_GROUP_OWNER_ADDRESS = \"go_host\";\n public static final String EXTRAS_GROUP_OWNER_PORT = \"go_port\";\n\n public FileTransferService() {\n super(\"FileTransferService\");\n }\n\n @Action(ACTION_SEND_FILE)\n public void sendFile( @Extra(EXTRAS_FILE_PATH) String fileUri, @Extra(EXTRAS_GROUP_OWNER_ADDRESS) String host, @Extra(EXTRAS_GROUP_OWNER_PORT) int port ) {\n Socket socket = new Socket();\n try {\n Log.d(WiFiDirectActivity.TAG, \"Opening client socket - \");\n socket.bind(null);\n socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT);\n\n Log.d(WiFiDirectActivity.TAG, \"Client socket - \" + socket.isConnected());\n OutputStream stream = socket.getOutputStream();\n ContentResolver cr = context.getContentResolver();\n InputStream is = null;\n try {\n is = cr.openInputStream(Uri.parse(fileUri));\n } catch (FileNotFoundException e) {\n Log.d(WiFiDirectActivity.TAG, e.toString());\n }\n DeviceDetailFragment.copyFile(is, stream);\n Log.d(WiFiDirectActivity.TAG, \"Client: Data written\");\n } catch (IOException e) {\n Log.e(WiFiDirectActivity.TAG, e.getMessage());\n } finally {\n if (socket != null) {\n if (socket.isConnected()) {\n try {\n socket.close();\n } catch (IOException e) {\n // Give up\n e.printStackTrace();\n }\n }\n }\n }\n }\n}\n```\n\nThe code reduction in this example isn't much, but it has already improved the readability of the code.\nWith more ACTIONs defined the effect would be much greater!\n\nThe generated onHandleIntent method could look like this:\n\n``` java\n @Override\n protected void onHandleIntent(Intent intent) {\n if ( ACTION_SEND_FILE.equals( intent.getAction() ) {\n String fileUri = intent.getExtras().getString(EXTRAS_FILE_PATH);\n String host = intent.getExtras().getString(EXTRAS_GROUP_OWNER_ADDRESS);\n int port = intent.getExtras().getInt(EXTRAS_GROUP_OWNER_PORT);\n sendFile( fileUri, host, port );\n } else if ( ACTION_OTHER.equals( intent.getAction() ) {\n // etc.\n }\n }\n```\n\nBut it would not only be possible to simplify the IntentService class itself, it's also possible to simplify the calling actions of the IntentService.\n\n``` java\nIntent intent = new Intent(context, FileTransferService.class);\nintent.setAction(FileTransferService.ACTION_SEND_FILE);\nintent.putExtra(FileTransferService.EXTRAS_FILE_PATH, \"/image.png\");\nintent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_ADDRESS, \"192.168.0.3\");\nintent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_PORT, 8080);\ncontext.startService(intent);\n```\n\ncould be converted to\n\n``` java\nFileTransferService_.intent(context).sendFile(\"/image.png\", \"192.168.0.3\", 8080).start();\n```\n\nI think this would be a great enhancement for every android programmer. But I do not know if annotations can be used that way and if the annotations names are the best choice for it.\n\nWhat do you think? Do you think that this is a good enhancement for androidannotations? And could it be implemented that way?\n","author":{"url":"https://github.com/pstefan","@type":"Person","name":"pstefan"},"datePublished":"2013-04-23T01:07:50.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3},"url":"https://github.com/572/androidannotations/issues/572"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:3581979a-4311-2f3d-059c-a5f8beab5f45 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | DFEA:390D7C:3717EB5:4C857A7:6A60E851 |
| html-safe-nonce | 4cece838222c967bce79a687013075ef212e8949348cbc1f26dee553ef27d8c3 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJERkVBOjM5MEQ3QzozNzE3RUI1OjRDODU3QTc6NkE2MEU4NTEiLCJ2aXNpdG9yX2lkIjoiODgyNjY4MjEyNDY3MjIzMTUwNiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 9cec3b18efe5ce6ba399dadeeb583889b7337bd295fa4847a69b26c316ff61eb |
| hovercard-subject-tag | issue:13514811 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/androidannotations/androidannotations/572/issue_layout |
| twitter:image | https://opengraph.githubassets.com/004332314d1f43c21dc33a348d35400868eb9160d55c2937375772424efee067/androidannotations/androidannotations/issues/572 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/004332314d1f43c21dc33a348d35400868eb9160d55c2937375772424efee067/androidannotations/androidannotations/issues/572 |
| og:image:alt | I am often using IntentService objects for background activities in my apps. These IntentService have quite many different ACTIONs in it, which are distinguished by different ACTION strings and dif... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | pstefan |
| hostname | github.com |
| expected-hostname | github.com |
| None | 1957f194e271fe30a03dc862496c17190cace7b76c3327faf05645d99ab7da7b |
| turbo-cache-control | no-preview |
| go-import | github.com/androidannotations/androidannotations git https://github.com/androidannotations/androidannotations.git |
| octolytics-dimension-user_id | 1315313 |
| octolytics-dimension-user_login | androidannotations |
| octolytics-dimension-repository_id | 3116751 |
| octolytics-dimension-repository_nwo | androidannotations/androidannotations |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 3116751 |
| octolytics-dimension-repository_network_root_nwo | androidannotations/androidannotations |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | ce4ea0e3ce641f8f789b539253752038d78f1cfe |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width