├── ic_launcher-web.png
├── libs
└── android-support-v4.jar
├── res
├── drawable-hdpi
│ └── ic_launcher.png
├── drawable-mdpi
│ └── ic_launcher.png
├── drawable-xhdpi
│ └── ic_launcher.png
├── drawable-xxhdpi
│ └── ic_launcher.png
├── values-sw600dp
│ └── dimens.xml
├── values
│ ├── dimens.xml
│ ├── strings.xml
│ └── styles.xml
├── menu
│ └── main.xml
├── values-sw720dp-land
│ └── dimens.xml
├── values-v11
│ └── styles.xml
├── values-v14
│ └── styles.xml
└── layout
│ └── activity_main.xml
├── gen
└── com
│ └── example
│ └── alwayson
│ ├── BuildConfig.java
│ └── R.java
├── src
└── com
│ └── example
│ └── alwayson
│ ├── service
│ ├── BaseService.java
│ ├── RebootBroadcastReceiver.java
│ ├── AlarmBroadcastReceiver.java
│ ├── AlwaysOnService.java
│ └── Bootstrap.java
│ ├── Constants.java
│ └── MainActivity.java
├── .gitattributes
├── README.md
├── project.properties
├── proguard-project.txt
├── AndroidManifest.xml
└── .gitignore
/ic_launcher-web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/ic_launcher-web.png
--------------------------------------------------------------------------------
/libs/android-support-v4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/libs/android-support-v4.jar
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/gen/com/example/alwayson/BuildConfig.java:
--------------------------------------------------------------------------------
1 | /** Automatically generated file. DO NOT MODIFY */
2 | package com.example.alwayson;
3 |
4 | public final class BuildConfig {
5 | public final static boolean DEBUG = true;
6 | }
--------------------------------------------------------------------------------
/res/values-sw600dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 16dp
5 | 16dp
6 |
7 |
8 |
--------------------------------------------------------------------------------
/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | AlwaysOn
5 | Settings
6 | Hello world!
7 |
8 |
9 |
--------------------------------------------------------------------------------
/res/menu/main.xml:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/res/values-sw720dp-land/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 | 128dp
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/com/example/alwayson/service/BaseService.java:
--------------------------------------------------------------------------------
1 | package com.example.alwayson.service;
2 |
3 | import android.app.Service;
4 | import android.content.Intent;
5 | import android.os.IBinder;
6 |
7 | public class BaseService extends Service {
8 |
9 | @Override
10 | public IBinder onBind(Intent arg0) {
11 | return null;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/res/values-v11/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/res/values-v14/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/com/example/alwayson/Constants.java:
--------------------------------------------------------------------------------
1 | package com.example.alwayson;
2 |
3 | public class Constants {
4 | public static final int ALARM_REPEAT_INTERVAL = 10;
5 | public static final String STARTUP_ACTION_NAME = "alwayson_startup_action_name";
6 |
7 | public static final String SHAREDPREF_RUNNINGTIMECOUNT_STRING = "com.example.alwayson.runningtimecount";
8 | public static final String SHAREDPREF_APP_STRING = "com.example.alwayson.sharedpref";
9 | }
10 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 | *.sln merge=union
7 | *.csproj merge=union
8 | *.vbproj merge=union
9 | *.fsproj merge=union
10 | *.dbproj merge=union
11 |
12 | # Standard to msysgit
13 | *.doc diff=astextplain
14 | *.DOC diff=astextplain
15 | *.docx diff=astextplain
16 | *.DOCX diff=astextplain
17 | *.dot diff=astextplain
18 | *.DOT diff=astextplain
19 | *.pdf diff=astextplain
20 | *.PDF diff=astextplain
21 | *.rtf diff=astextplain
22 | *.RTF diff=astextplain
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | AlwaysOn
2 | ========
3 |
4 | A template for how to resurrect/keeps running an Android service in the background even when the user kills the service.
5 |
6 | This template has the following four ways to revive the service,
7 |
8 | 1. User starts the app again.
9 | 2. User presses power key to turn on the screen.
10 | 3. User restarts the phone.
11 | 4. 10 seconds passed after anything/anyone kills our service.
12 |
13 | Here is a [detailed explanation](http://engineereverything.wordpress.com/2013/11/27/android-how-to-resurrectstay-in-the-background-even-the-user-kills-the-app/) on the project.
14 |
--------------------------------------------------------------------------------
/project.properties:
--------------------------------------------------------------------------------
1 | # This file is automatically generated by Android Tools.
2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
3 | #
4 | # This file must be checked in Version Control Systems.
5 | #
6 | # To customize properties used by the Ant build system edit
7 | # "ant.properties", and override values to adapt the script to your
8 | # project structure.
9 | #
10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
12 |
13 | # Project target.
14 | target=android-18
15 |
--------------------------------------------------------------------------------
/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/com/example/alwayson/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.alwayson;
2 |
3 | import com.example.alwayson.service.Bootstrap;
4 |
5 | import android.os.Bundle;
6 | import android.app.Activity;
7 | import android.view.Menu;
8 |
9 | public class MainActivity extends Activity {
10 |
11 | @Override
12 | protected void onCreate(Bundle savedInstanceState) {
13 | super.onCreate(savedInstanceState);
14 | setContentView(R.layout.activity_main);
15 | Bootstrap.startAlwaysOnService(this, "Main");
16 | }
17 |
18 | @Override
19 | public boolean onCreateOptionsMenu(Menu menu) {
20 | // Inflate the menu; this adds items to the action bar if it is present.
21 | getMenuInflater().inflate(R.menu.main, menu);
22 | return true;
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/src/com/example/alwayson/service/RebootBroadcastReceiver.java:
--------------------------------------------------------------------------------
1 | package com.example.alwayson.service;
2 |
3 | import android.content.BroadcastReceiver;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.util.Log;
7 |
8 | public class RebootBroadcastReceiver extends BroadcastReceiver {
9 | private static final String LOG_TAG = RebootBroadcastReceiver.class.getSimpleName();
10 |
11 | @Override
12 | public void onReceive(Context context, Intent intent) {
13 | Log.v(LOG_TAG, "onReceive");
14 |
15 | if ((intent.getAction().equals(Intent.ACTION_USER_PRESENT))
16 | || (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))) {
17 | Bootstrap.startAlwaysOnService(context, intent.getAction());
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
14 |
15 |
16 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/proguard-project.txt:
--------------------------------------------------------------------------------
1 | # To enable ProGuard in your project, edit project.properties
2 | # to define the proguard.config property as described in that file.
3 | #
4 | # Add project specific ProGuard rules here.
5 | # By default, the flags in this file are appended to flags specified
6 | # in ${sdk.dir}/tools/proguard/proguard-android.txt
7 | # You can edit the include path and order by changing the ProGuard
8 | # include property in project.properties.
9 | #
10 | # For more details, see
11 | # http://developer.android.com/guide/developing/tools/proguard.html
12 |
13 | # Add any project specific keep options here:
14 |
15 | # If your project uses WebView with JS, uncomment the following
16 | # and specify the fully qualified class name to the JavaScript interface
17 | # class:
18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
19 | # public *;
20 | #}
21 |
--------------------------------------------------------------------------------
/src/com/example/alwayson/service/AlarmBroadcastReceiver.java:
--------------------------------------------------------------------------------
1 | package com.example.alwayson.service;
2 |
3 | import com.example.alwayson.Constants;
4 |
5 | import android.content.BroadcastReceiver;
6 | import android.content.Context;
7 | import android.content.Intent;
8 |
9 | public class AlarmBroadcastReceiver extends BroadcastReceiver {
10 | private static final String LOG_TAG = AlarmBroadcastReceiver.class.getSimpleName();
11 | public static final String ACTION_CUSTOM_ALARM = "alwayson.alarm.action";
12 |
13 | @Override
14 | public void onReceive(Context context, Intent intent) {
15 | if (intent.getAction().equals(AlarmBroadcastReceiver.ACTION_CUSTOM_ALARM)) {
16 | String previousAction = intent
17 | .getStringExtra(Constants.STARTUP_ACTION_NAME);
18 | if (previousAction == null || previousAction.length() == 0) {
19 | previousAction = intent.getAction();
20 | }
21 | Bootstrap.startAlwaysOnService(context, previousAction);
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
10 |
11 |
12 |
13 |
18 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/src/com/example/alwayson/service/AlwaysOnService.java:
--------------------------------------------------------------------------------
1 | package com.example.alwayson.service;
2 |
3 | import java.util.concurrent.Executors;
4 | import java.util.concurrent.ScheduledExecutorService;
5 | import java.util.concurrent.TimeUnit;
6 |
7 | import com.example.alwayson.Constants;
8 |
9 | import android.content.Context;
10 | import android.content.Intent;
11 | import android.content.SharedPreferences;
12 | import android.util.Log;
13 |
14 | public class AlwaysOnService extends BaseService {
15 | private static String LOG_TAG = AlwaysOnService.class.getSimpleName();
16 | public static boolean isRunning = false;
17 | private ScheduledExecutorService backgroundService;
18 |
19 | @Override
20 | public int onStartCommand(Intent intent, int flags, int startId) {
21 | if (isRunning == false) {
22 | // run something
23 | backgroundService = Executors.newSingleThreadScheduledExecutor();
24 | backgroundService.scheduleAtFixedRate(new TimerIncreasedRunnable(
25 | this), 0, 1000, TimeUnit.MILLISECONDS);
26 | isRunning = true;
27 | }
28 | // the following will return START_STICKY
29 | return super.onStartCommand(intent, flags, startId);
30 | }
31 |
32 | @Override
33 | public void onDestroy() {
34 | // stop running
35 | isRunning = false;
36 | backgroundService.shutdownNow();
37 | super.onDestroy();
38 | }
39 |
40 | public class TimerIncreasedRunnable implements Runnable {
41 | private SharedPreferences currentSharedPreferences;
42 |
43 | public TimerIncreasedRunnable(Context context) {
44 | this.currentSharedPreferences = context.getSharedPreferences(
45 | Constants.SHAREDPREF_APP_STRING, MODE_PRIVATE);
46 | }
47 |
48 | @Override
49 | public void run() {
50 | int timeCount = this.readTimeCount() + 1;
51 | this.writeTimeCount(timeCount);
52 | int currentEpochTimeInSeconds = (int) (System.currentTimeMillis() / 1000L);
53 | Log.v(LOG_TAG, "Count:" + timeCount + " at time:"
54 | + currentEpochTimeInSeconds);
55 | }
56 |
57 | private int readTimeCount() {
58 | return this.currentSharedPreferences.getInt(
59 | Constants.SHAREDPREF_RUNNINGTIMECOUNT_STRING, 0);
60 | }
61 |
62 | private void writeTimeCount(int timeCount) {
63 | this.currentSharedPreferences.edit().putInt(
64 | Constants.SHAREDPREF_RUNNINGTIMECOUNT_STRING,
65 | timeCount).commit();
66 | }
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/gen/com/example/alwayson/R.java:
--------------------------------------------------------------------------------
1 | /* AUTO-GENERATED FILE. DO NOT MODIFY.
2 | *
3 | * This class was automatically generated by the
4 | * aapt tool from the resource data it found. It
5 | * should not be modified by hand.
6 | */
7 |
8 | package com.example.alwayson;
9 |
10 | public final class R {
11 | public static final class attr {
12 | }
13 | public static final class dimen {
14 | /** Default screen margins, per the Android Design guidelines.
15 |
16 | Customize dimensions originally defined in res/values/dimens.xml (such as
17 | screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here.
18 |
19 | */
20 | public static final int activity_horizontal_margin=0x7f040000;
21 | public static final int activity_vertical_margin=0x7f040001;
22 | }
23 | public static final class drawable {
24 | public static final int ic_launcher=0x7f020000;
25 | }
26 | public static final class id {
27 | public static final int action_settings=0x7f080000;
28 | }
29 | public static final class layout {
30 | public static final int activity_main=0x7f030000;
31 | }
32 | public static final class menu {
33 | public static final int main=0x7f070000;
34 | }
35 | public static final class string {
36 | public static final int action_settings=0x7f050001;
37 | public static final int app_name=0x7f050000;
38 | public static final int hello_world=0x7f050002;
39 | }
40 | public static final class style {
41 | /**
42 | Base application theme, dependent on API level. This theme is replaced
43 | by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
44 |
45 |
46 | Theme customizations available in newer API levels can go in
47 | res/values-vXX/styles.xml, while customizations related to
48 | backward-compatibility can go here.
49 |
50 |
51 | Base application theme for API 11+. This theme completely replaces
52 | AppBaseTheme from res/values/styles.xml on API 11+ devices.
53 |
54 | API 11 theme customizations can go here.
55 |
56 | Base application theme for API 14+. This theme completely replaces
57 | AppBaseTheme from BOTH res/values/styles.xml and
58 | res/values-v11/styles.xml on API 14+ devices.
59 |
60 | API 14 theme customizations can go here.
61 | */
62 | public static final int AppBaseTheme=0x7f060000;
63 | /** Application theme.
64 | All customizations that are NOT specific to a particular API-level can go here.
65 | */
66 | public static final int AppTheme=0x7f060001;
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/src/com/example/alwayson/service/Bootstrap.java:
--------------------------------------------------------------------------------
1 | package com.example.alwayson.service;
2 |
3 | import android.app.AlarmManager;
4 | import android.app.PendingIntent;
5 | import android.content.ComponentName;
6 | import android.content.Context;
7 | import android.content.Intent;
8 | import android.content.pm.PackageManager;
9 | import java.util.Calendar;
10 |
11 | import com.example.alwayson.Constants;
12 |
13 | public class Bootstrap {
14 |
15 | private static String TAG = Bootstrap.class.getSimpleName();
16 |
17 | public static synchronized void startAlwaysOnService(Context context,
18 | String loadedFrom) {
19 |
20 | if (AlwaysOnService.isRunning == false) {
21 | // start service
22 | Intent pIntent = new Intent(context, AlwaysOnService.class);
23 | pIntent.putExtra(Constants.STARTUP_ACTION_NAME, loadedFrom);
24 | context.startService(pIntent);
25 |
26 | // enable 10 secs restart
27 | Intent mIntent = new Intent(context, AlarmBroadcastReceiver.class);
28 | mIntent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
29 | mIntent.putExtra(Constants.STARTUP_ACTION_NAME, loadedFrom);
30 | mIntent.setAction(AlarmBroadcastReceiver.ACTION_CUSTOM_ALARM);
31 | PendingIntent sender = PendingIntent.getBroadcast(context, 0,
32 | mIntent, 0);
33 | Calendar time = Calendar.getInstance();
34 | time.setTimeInMillis(System.currentTimeMillis());
35 | time.add(Calendar.SECOND, 1);
36 |
37 | AlarmManager am = (AlarmManager) context
38 | .getSystemService(Context.ALARM_SERVICE);
39 |
40 | am.setRepeating(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),
41 | Constants.ALARM_REPEAT_INTERVAL * 1000, sender);
42 |
43 | // enable boot/powerkey restart
44 | setBootupListen(context, true);
45 | }
46 | }
47 |
48 | public static synchronized void stopAlwaysOnService(Context context) {
49 |
50 | // stop service
51 | Intent pIntent = new Intent(context, AlwaysOnService.class);
52 | context.stopService(pIntent);
53 |
54 | // cancel alarm restart
55 | Intent intent = new Intent(context, AlarmBroadcastReceiver.class);
56 | intent.setAction(AlarmBroadcastReceiver.ACTION_CUSTOM_ALARM);
57 | PendingIntent sender = PendingIntent
58 | .getBroadcast(context, 0, intent, 0);
59 | AlarmManager alarmManager = (AlarmManager) context
60 | .getSystemService(Context.ALARM_SERVICE);
61 | alarmManager.cancel(sender);
62 |
63 | // cancel boot/power key restart
64 | setBootupListen(context, false);
65 | }
66 |
67 | private static void setBootupListen(Context context, boolean isEnabled) {
68 | int flag = (isEnabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
69 | : PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
70 | ComponentName component = new ComponentName(context,
71 | RebootBroadcastReceiver.class);
72 |
73 | context.getPackageManager().setComponentEnabledSetting(component, flag,
74 | PackageManager.DONT_KILL_APP);
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | #################
2 | ## Eclipse
3 | #################
4 |
5 | *.pydevproject
6 | .project
7 | .metadata
8 | bin/
9 | tmp/
10 | *.tmp
11 | *.bak
12 | *.swp
13 | *~.nib
14 | local.properties
15 | .classpath
16 | .settings/
17 | .loadpath
18 |
19 | # External tool builders
20 | .externalToolBuilders/
21 |
22 | # Locally stored "Eclipse launch configurations"
23 | *.launch
24 |
25 | # CDT-specific
26 | .cproject
27 |
28 | # PDT-specific
29 | .buildpath
30 |
31 |
32 | #################
33 | ## Visual Studio
34 | #################
35 |
36 | ## Ignore Visual Studio temporary files, build results, and
37 | ## files generated by popular Visual Studio add-ons.
38 |
39 | # User-specific files
40 | *.suo
41 | *.user
42 | *.sln.docstates
43 |
44 | # Build results
45 |
46 | [Dd]ebug/
47 | [Rr]elease/
48 | x64/
49 | build/
50 | [Bb]in/
51 | [Oo]bj/
52 |
53 | # MSTest test Results
54 | [Tt]est[Rr]esult*/
55 | [Bb]uild[Ll]og.*
56 |
57 | *_i.c
58 | *_p.c
59 | *.ilk
60 | *.meta
61 | *.obj
62 | *.pch
63 | *.pdb
64 | *.pgc
65 | *.pgd
66 | *.rsp
67 | *.sbr
68 | *.tlb
69 | *.tli
70 | *.tlh
71 | *.tmp
72 | *.tmp_proj
73 | *.log
74 | *.vspscc
75 | *.vssscc
76 | .builds
77 | *.pidb
78 | *.log
79 | *.scc
80 |
81 | # Visual C++ cache files
82 | ipch/
83 | *.aps
84 | *.ncb
85 | *.opensdf
86 | *.sdf
87 | *.cachefile
88 |
89 | # Visual Studio profiler
90 | *.psess
91 | *.vsp
92 | *.vspx
93 |
94 | # Guidance Automation Toolkit
95 | *.gpState
96 |
97 | # ReSharper is a .NET coding add-in
98 | _ReSharper*/
99 | *.[Rr]e[Ss]harper
100 |
101 | # TeamCity is a build add-in
102 | _TeamCity*
103 |
104 | # DotCover is a Code Coverage Tool
105 | *.dotCover
106 |
107 | # NCrunch
108 | *.ncrunch*
109 | .*crunch*.local.xml
110 |
111 | # Installshield output folder
112 | [Ee]xpress/
113 |
114 | # DocProject is a documentation generator add-in
115 | DocProject/buildhelp/
116 | DocProject/Help/*.HxT
117 | DocProject/Help/*.HxC
118 | DocProject/Help/*.hhc
119 | DocProject/Help/*.hhk
120 | DocProject/Help/*.hhp
121 | DocProject/Help/Html2
122 | DocProject/Help/html
123 |
124 | # Click-Once directory
125 | publish/
126 |
127 | # Publish Web Output
128 | *.Publish.xml
129 | *.pubxml
130 |
131 | # NuGet Packages Directory
132 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line
133 | #packages/
134 |
135 | # Windows Azure Build Output
136 | csx
137 | *.build.csdef
138 |
139 | # Windows Store app package directory
140 | AppPackages/
141 |
142 | # Others
143 | sql/
144 | *.Cache
145 | ClientBin/
146 | [Ss]tyle[Cc]op.*
147 | ~$*
148 | *~
149 | *.dbmdl
150 | *.[Pp]ublish.xml
151 | *.pfx
152 | *.publishsettings
153 |
154 | # RIA/Silverlight projects
155 | Generated_Code/
156 |
157 | # Backup & report files from converting an old project file to a newer
158 | # Visual Studio version. Backup files are not needed, because we have git ;-)
159 | _UpgradeReport_Files/
160 | Backup*/
161 | UpgradeLog*.XML
162 | UpgradeLog*.htm
163 |
164 | # SQL Server files
165 | App_Data/*.mdf
166 | App_Data/*.ldf
167 |
168 | #############
169 | ## Windows detritus
170 | #############
171 |
172 | # Windows image file caches
173 | Thumbs.db
174 | ehthumbs.db
175 |
176 | # Folder config file
177 | Desktop.ini
178 |
179 | # Recycle Bin used on file shares
180 | $RECYCLE.BIN/
181 |
182 | # Mac crap
183 | .DS_Store
184 |
185 |
186 | #############
187 | ## Python
188 | #############
189 |
190 | *.py[co]
191 |
192 | # Packages
193 | *.egg
194 | *.egg-info
195 | dist/
196 | build/
197 | eggs/
198 | parts/
199 | var/
200 | sdist/
201 | develop-eggs/
202 | .installed.cfg
203 |
204 | # Installer logs
205 | pip-log.txt
206 |
207 | # Unit test / coverage reports
208 | .coverage
209 | .tox
210 |
211 | #Translations
212 | *.mo
213 |
214 | #Mr Developer
215 | .mr.developer.cfg
216 |
--------------------------------------------------------------------------------